Ada : Outils de débogage

Compilation

Votre programme doit être compilé avec l'option -g. Cette option de compilation conserve dans l'exécutable les informations utiles aux débogueurs (numéros de ligne du code source, noms des variables, …). Sur Ada (compilateurs Intel) :

  • l'option -g n'est pas positionnée par défaut;
  • lorsque seule l'option -g est spécifiée, le niveau d'optimisation du compilateur Intel passe du défaut -O2 à -O0, aucune optimisation. Il est néanmoins possible de spécifier explicitement le niveau d'optimisation -O2 (ou supérieur) sur la ligne de commande, avec l'option -g : cela peut être utile lorsqu'inhiber l'optimisation fait disparaître le bogue étudié;
  • une liste complète des options de débogage des compilateurs Intel est disponible sur cette page.

GDB

GDB est un débogueur en ligne de commande. Il est disponible en interactif sur la frontale interactive d'Ada. Voici un exemple de session GDB (placement d'un point d'arrêt, exécution et affichage de la liste des appels de fonction) :

$ ifort -g main.f
$ gdb ./a.out

(gdb) help
[...]

(gdb) break main.f:13
Breakpoint 1 at 0x402af1: file main.f, line 13.

(gdb) run
Starting program: a.out
Breakpoint 1, main () at main.f:13
13	      if (a == 0) then

(gdb) backtrace
#0  main () at main.f:13
#1  0x0000000000402a9c in main ()

(gdb) print a
$1 = 8

(gdb) continue

(gdb) quit

La documentation de GDB est disponible en ligne ou directement sur Ada (commande man gdb).

TotalView

TotalView est un débogueur parallèle graphique. Il est disponible sur la frontale interactive et les nœuds de calcul d'Ada . Il supporte la bibliothèque d'échange de messages MPI ainsi qu'OpenMP et les applications multithreadées avec Pthreads.

TotalView

Lancement de TotalView

Attention: Il n'est plus possible d'utiliser simplement la commande tv poe -a ./mon_executable pour lancer TotalView en parallèle (interactif ou batch) : les caractéristiques parallèles du programme ne sont pas correctement prises en compte et il n'est pas non plus possible de naviguer dans le code source. Il faut utiliser la fenêtre graphique Startup Parameter comme décrit ci-dessous pour avoir un comportement normal.

Déport d'affichage

TotalView est un débogueur graphique. Pour bénéficier du mode graphique, il est nécessaire de mettre en place un déport d'affichage XWindows depuis l'IDRIS vers votre terminal : contactez la Permanence de l'Assistance en cas d'échec avéré. Il est aussi possible de lancer TotalView sans interface graphique en utilisant la commande tvcli mais cela réduit fortement l'intérêt de TotalView. L'utilisation en mode ligne de commande est toutefois décrite dans le Guide de référence.

Lancement en interactif séquentiel

Pour utiliser TotalView en séquentiel sur la frontale interactive, il suffit de charger le module de TotalView puis d'utiliser la commande tv, tv8 ou totalview :

$ module load tv
(load) totalview version 2016.06.21
$ tv ./mon_executable -a arg1 arg2

Ce mode de fonctionnement permet notamment de se familiariser avec l'interface graphique de TotalView sans facturation de ressources.

Lancement en interactif parallèle

TotalView se charge d'interagir avec poe pour le lancement des travaux parallèles. En interactif (jusqu'à 32 processus MPI), il suffit de lancer TotalView sur la frontale (voir ci-dessus) puis d'utiliser la fenêtre graphique Startup Parameter (par défaut, ou Ctrl+A) pour configurer la session de débogage. Dans l'onglet Parallel, il faut sélectionner dans Parallel system poe - Linux et configurer le nombre de Tasks nécessaire.

Fenêtre d'initialisation de TotalView

Lancement en batch parallèle

En batch, il ne faut pas oublier dans le script de soumission de charger le module de TotalView et de configurer le déport d'affichage. Il faut impérativement être disponible devant son écran lors du démarrage du travail. Pour obtenir à l'écran les messages de la sortie standard de votre programme, il est nécessaire de lancer TotalView dans un terminal (sinon, vous devrez lire ces lignes dans le fichier de sortie du travail). Voici un exemple de soumission batch pour une session de débogage MPI sur 16 cœurs :

job.ll
# @ job_name = TotalView
# @ job_type = parallel
# @ output = $(job_name).$(jobid)
# @ error = $(output)
# @ wall_clock_limit = 00:30:00
# @ total_tasks = 16
# @ environment = $DISPLAY
# @ queue
 
set -x
 
xterm -sb -e 'module load tv; tv'

Dans l'onglet Parallel de la fenêtre Startup Parameter, il faut sélectionner dans Parallel system poe - Linux et configurer le nombre de Tasks adéquat. Attention : en parallèle, les ressources sont facturées. C'est pourquoi il faut faire attention à être disponible lors du démarrage du job, mais aussi à ne pas laisser une session de débogage ouverte inutilement après la session de déboguage (vérification possible avec la commande llq -u mon_login).

Utilisation de TotalView

Après avoir fermé la fenêtre Startup Parameter, la fenêtre principale de TotalView affiche le code source du programme principal. Il est possible de naviguer dans le code source (clique droit sur le nom d'une fonction puis Dive) et d'ajouter des points d'arrêts (en cliquant sur les numéros de ligne). Pour lancer le programme, cliquez sur la flèche verte Go de la barre outils. TotalView dispose d'options avancées pour le débogage de problèmes mémoires (débordements de tableaux, fuites mémoires). Dans la fenêtre Startup Parameter de Totalview (ou Ctrl+A), il faut cocher Enable Memory Debugging (ou l'activer via le menu Debug de la fenêtre principale); cette option ralentit toutefois significativement l'exécution du programme. Des statistiques concernant l'usage mémoire sont disponibles dans la fenêtre MemoryScape (menu Debug puis Open Memoryscape ou Alt+Shift+M).

MemoryScape

Problèmes connus

  • l'utilisation de la fenêtre graphique Startup Parameter est obligatoire;
  • le ReplayEngine ne fonctionne pas.

Ressources complémentaires

Les documentations de la version la plus récente de la documentation de TotalView sont disponibles sur le site de l'éditeur Rogue Wave :

La documentation complète de la version de TotalView disponible par défaut sur Ada (en PDF, sur notre serveur Web) :