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. Par ailleurs, il permet de contrôler l'exécution d'un code soumis sous l'environnement parallèle MPI Intel (mpirun) ou MPI IBM (poe).

Lancement de TotalView en interactif

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.

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

$ module load totalview
$ tv

Une fois Totalview lancé, une fenêtre apparaît :

Fenêtre d'initialisation de TotalView

  • Programme séquentiel

Dans la fenêtre ci-dessus, choisir: A new program

Une nouvelle fenêtre apparaît dans laquelle on peut renseigner le nom de l'exécutable ainsi que ses arguments éventuels.

  • Programme parallèle

Pour les applications multithreadées et hybrides utilisant OpenMP, il faut, avant de lancer Totalview, définir explicitement le nombre de threads de l'application en valorisant la variable OMP_NUM_THREADS.

Exemple: export OMP_NUM_THREADS=4

Dans la fenêtre ci-dessus, choisir: A new parallel program

Une nouvelle fenêtre apparaît dans laquelle on doit choisir l'environnement parallèle : Fenêtre d'initialisation de TotalView

Il suffit de dérouler le menu : Select your parallel system et de choisir entre : poe - Linux et Intel MPI

On choisit le nombre de processus MPI en remplissant le champ Tasks. Il est à noter que le nombre maximal de processus MPI est limité à 4 pour poe et 32 pour mpirun.

Puis, en cliquant sur Next, on retrouve une fenêtre permettant de renseigner le nom de l'exécutable ainsi que ses arguments éventuels.

Lancement de TotalView 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).

  • Soumission batch pour une session de débogage MPI IBM (poe) 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'

La fenêtre de démarrage de TotalView s'ouvre et on se retrouve dans la même situation que “Lancement de TotalView en interactif”/“Programme parallèle”. Attention, il s'agit d'un job parallèle sous environnement IBM donc il faut impérativement sélectionner poe - Linux dans la rubrique Select your parallel system .

  • Soumission batch pour une session de débogage MPI Intel (mpirun) sur 16 cœurs
job.ll
# @ job_name = TotalView
# @ job_type = mpich
# @ 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'

La fenêtre de démarrage de TotalView s'ouvre et on se retrouve dans la même situation que “Lancement de TotalView en interactif”/“Programme parallèle”. Attention, il s'agit d'un job parallèle sous environnement Intel donc il faut impérativement sélectionner MPI Intel dans la rubrique Select your parallel system .

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 son travail (vérification possible avec la commande llq -u mon_login).

Utilisation de TotalView

Après avoir cliqué sur le bouton Start Session, 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

TotalView dispose d'options avancées pour le débogage de problèmes mémoires (débordements de tableaux, fuites mémoires). Pour y accéder, avant de faire Start Session, il faut cliquer sur le bouton DEBUG OPTION dans la fenêtre gauche de TotalView et ensuite cocher Enable Memory Debugging .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

  • 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) :