GDB: Debogueur GNU Multi-langage Permet l’inspection du source pendant l’exécution Permet le débogage post-mortem Bogue (de châtaigne), terme recommandé par la DGLFLF pour bug (insecte) 1
Flags Compilation normale d’un programme: – gcc [flags] -o – Exemple: gcc -Wall -Werror -ansi prog1.c -o prog1.x On ajoute l’option –g pour gdb – gcc [other flags] -g -o – Exemple gcc -Wall -Werror -ansi -g prog1.c -o prog1.x Ne pas demander d’optimisations! 2
Usage Juste: “gdb” ou “gdb prog1.x” On obtient une invite: – (gdb) Si on n’a pas spécifié de programme, on le met ici: – (gdb) file prog1.x prog1.x est le programme à charger pour exécution, et “file” est la commande pour le charger 3
À savoir gdb a un shell: on peut retrouver l’historique des commandes avec les flèches de direction, souvent la touche “tabulation” permet de compléter la commande. Il y a un help – (gdb) help – (gdb) help [command] Le programme sous gdb a le même comportement que celui compilé sans –g sauf – Si la bogue vient des optimisations – Si la bogue vient de l’initialisation (oubliée) des variables – Autrement dit, si différence de comportement, chercher de ces côtés là. 4
Lancer le programme (gdb) run Lance le programme – Si le programme n’a pas d’erreur, l’exécution se déroule normalement jusqu’à son terme. – Si il y avait un problème à l’exécution normale, le programme plante maintenant avec des indications utiles sur l’endroit et le contexte: Program received signal SIGSEGV, Segmentation fault. 0x in sum array region (arr=0x7fffc902a270, r1=2, c1=5, r2=4, c2=6) at sum-array- region2.c:12 5
S’il y a une bogue On veut pouvoir – Arrêter le programme – Mettre des points de surveillance Sur position Sur des variables – Exécuter pas par pas – Modifier des variables 6
Contrôle-C Arrêter le programme par contrôle-C rend la main « là où le programme est ». On peut alors exécuter toutes les commandes de gdb Utile si le programme part en boucle Attention à ce que l’on peut être au fond d’une fonction système (compilée sans l’option –g): commande finish dans ce cas. 7
Points d’arrêts (breakpoints) Utiles pour arrêter le programme pendant son exécution à des endroits convenus Première forme: par fichier/numéro de ligne – (gdb) break file1.c:6 – (gdb) break 6 – Ceci met un point ligne 6, dans file1.c. Si (et seulement si) le programme passe par là, il va s’arrêter et donner la main. On peut omettre le nom du fichier si pas d’ambiguïté. On peut mettre autant de points d’arrêt que l’on veut. 8
Autres formes On peut s’arrêter à l’invocation d’une fonction. Si on a la fonction: – int my_func(int a, char *b); On peut forcer l’arrêt à chaque appel de my_func – (gdb) break my_func 9
Lancer et relancer après arrêt (1) Pour lancer le programme sous gdb, commande run (r) – (gdb) run Une fois arrêté, on peut repartir en émettant la commande continue (c). (gdb) continue On peut toujours remettre la commande run (repart depuis le début) 10
Lancer et relancer après arrêt (2) Avancer l’exécution d’une ligne: step (s) – (gdb) step Avancer l’exécution d’une instruction: next (n) – (gdb) next La différence est que next saute par-dessus l’appel des routines, alors que step entre dedans. On peut s’épargner de la frappe en tapant juste, la commande précédente (next ou step) sera répétée. 11
Examen des variables Commande print – (gdb) print my_var En hexadécimal – (gdb) print/x my_var Attention à la visibilité des variables: Gdb s’intéressera à la variable visible là où vous êtes. 12
Surveillance de variables (watchpoints) De même que les points d’arrêts agissent quand le programme atteint une position, les points de surveillance agissent quand une variable est modifiée. – (gdb) watch my_var Chaque fois que my_var sera modifiée, gdb s’arrêtera et donnera la main, montrant ancienne et nouvelle valeurs. Attention encore à la visibilité des variables: il peut y avoir des homonymes. Gdb s’intéressera à la variable visible là où vous posez le watchpoint. De ce fait, il peut être nécessaire de poser un breakpoint juste pour pouvoir poser un watchpoint. 13
Forcer une variable On peut forcer la valeur d’une variable – (gdb) set var my_var = val – (gdb) continue Attention à la visibilité des variables 14
Autres commandes where (w) ou backtrace (bt): donne la pile d’appel au moment de l’invocation de la commande. Par exemple quand le programme est planté. finish (f): termine la fonction courante et rend la main. delete (d): détruit un point d’arrêt. info breakpoints: donne la liste. 15
Complications utiles Souvent le souci n’apparaît que sur une condition particulière qui demande beaucoup de passages par le même breakpoint. Arrêts conditionnels: – (gdb) break file1.c:6 if i >= ARRAYSIZE – Ici l’arrêt ne se fera que si la condition est vraie. – On peut mettre plusieurs points d’arrêt au même endroit avec des conditions différentes (effet d’un ou logique) 16
Post-mortem – Le fichier core qui apparaît après un ‘core dump’ peut être utilisé par gdb pour un débogage post- mortem: gdb core – Les commandes d’examen (qui n’impliquent pas une exécution) peuvent être utilisées: where print Elles donneront l’information demandée au moment du plantage. 17