170 likes | 244 Views
Bogue (de châtaigne), terme recommandé par la DGLFLF pour bug (insecte). GDB: Debogueur GNU. Multi-langage Permet l’inspection du source pendant l’exécution Permet le débogage post-mortem. Flags. Compilation normale d’un programme : gcc [flags] <source files> -o <output file>
E N D
Bogue (de châtaigne), terme recommandé par la DGLFLF pour bug (insecte) GDB: Debogueur GNU Multi-langage Permet l’inspection du source pendant l’exécution Permet le débogage post-mortem
Flags • Compilation normale d’un programme: • gcc [flags] <source files> -o <output file> • Exemple: • gcc -Wall -Werror -ansi prog1.c -o prog1.x • On ajoutel’option –g pour gdb • gcc [other flags] -g <source files> -o <output file> • Exemple • gcc -Wall -Werror -ansi -g prog1.c -o prog1.x • Ne pas demander d’optimisations!
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
À savoir • gdb a un shell: on peutretrouverl’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à.
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écutionnormale, le programmeplantemaintenant avec des indications utilessurl’endroit et le contexte: • Program received signal SIGSEGV, Segmentation fault. 0x0000000000400524 in sum array region (arr=0x7fffc902a270, r1=2, c1=5, r2=4, c2=6) atsum-array-region2.c:12
S’il y a une bogue • On veutpouvoir • Arrêter le programme • Mettre des points de surveillance • Sur position • Sur des variables • Exécuter pas par pas • Modifier des variables
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.
Points d’arrêts (breakpoints) • Utiles pour arrêter le programme pendant son exécution à des endroitsconvenus • 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 seulementsi) le programmepasse par là, ilvas’arrêter et donner la main. On peutomettre le nom du fichiersi pas d’ambiguïté. • On peut mettre autant de points d’arrêt que l’on veut.
Autres formes • On peuts’arrêter à l’invocationd’unefonction. • Si on a la fonction: • intmy_func(int a, char *b); • On peut forcer l’arrêt à chaque appel de my_func • (gdb) break my_func
Lancer et relancer après arrêt (1) • Pour lancer le programme sous gdb, commande run (r) • (gdb) run • Unefoisarrêté, on peutrepartir en émettant la commande continue (c). • (gdb) continue • On peuttoujoursremettre la commande run (repartdepuis le début)
Lancer et relancer après arrêt (2) • Avancerl’exécutiond’uneligne: step (s) • (gdb) step • Avancerl’exécutiond’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 <return>, la commande précédente (next ou step) sera répétée.
Examen des variables • Commande print • (gdb) printmy_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.
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) watchmy_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.
Forcer une variable • On peut forcer la valeur d’une variable • (gdb) set var my_var = val • (gdb) continue • Attention à la visibilité des variables
Autres commandes • where (w) oubacktrace (bt): donne la pile d’appel au moment de l’invocation de la commande. Par exemplequand le programmeestplanté. • finish (f): termine la fonction courante et rend la main. • delete (d): détruit un point d’arrêt. • info breakpoints: donne la liste.
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)
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.