gdb(1)
Outil de développement
Le débogueur GNU : lancer un programme, l'arrêter sur une ligne, lire ses variables et la pile d'appels au moment d'un crash.
gdb [options] programmeDescription
gdb exécute ton programme sous contrôle. Il peut l'arrêter sur une ligne, l'avancer instruction par instruction, afficher la valeur de n'importe quelle variable, et surtout dire où il s'est arrêté quand il plante. Pour qu'il connaisse les noms de tes variables et les numéros de lignes, compile avec -g.
Les commandes à connaître
| Commande | Effet |
|---|---|
run (ou r) | lance le programme, avec ses arguments éventuels : run fichier.txt |
bt | affiche la pile d'appels, du plus récent au plus ancien |
break 12 | pose un point d'arrêt sur la ligne 12 du fichier courant |
break ma_fonction | s'arrête à l'entrée de la fonction |
next (ou n) | exécute la ligne courante sans entrer dans les fonctions appelées |
step (ou s) | exécute la ligne courante en entrant dans les fonctions |
print x (ou p x) | affiche la valeur d'une expression |
continue (ou c) | reprend jusqu'au prochain point d'arrêt |
quit (ou q) | quitte gdb |
En interactif, tu tapes ces commandes une par une à l'invite (gdb). Pour un diagnostic rapide, -batch les enchaîne depuis la ligne de commande et quitte à la fin.
Exemple
#include <stdio.h>
int main(void){ int total = 0;
for (int i = 1; i <= 4; i++) total += i * i; printf("%d\n", total); return 0;}$ gcc -g somme.c -o somme$ gdb -q -batch -ex 'break 8' -ex run -ex 'print i' -ex 'print total' -ex continue -ex 'print total' ./sommeBreakpoint 1 at 0x40065c: file somme.c, line 8.
Breakpoint 1, main () at somme.c:88 total += i * i;$1 = 1$2 = 0
Breakpoint 1, main () at somme.c:88 total += i * i;$3 = 1Au premier arrêt, la ligne 8 n'a pas encore été exécutée : i vaut 1 et total vaut encore 0. Au deuxième passage, total a reçu 1 * 1.
Pièges
Sans
-g, gdb ne voit ni les lignes ni les variables : la pile d'appels n'affiche que des adresses.Avec
-O2, le compilateur réorganise le code et certaines variables s'affichent<optimized out>. Débogue en-O0, l'option par défaut.Après un crash dans la bibliothèque C (
strlen,printf), le haut debtn'est pas ton code. Descends jusqu'à la première ligne qui nomme ton fichier.