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.

Synopsis
gdb [options] programme

Description

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

CommandeEffet
run (ou r)lance le programme, avec ses arguments éventuels : run fichier.txt
btaffiche la pile d'appels, du plus récent au plus ancien
break 12pose un point d'arrêt sur la ligne 12 du fichier courant
break ma_fonctions'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

somme.c
#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;}
Terminal
$ 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 = 1

Au 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 de bt n'est pas ton code. Descends jusqu'à la première ligne qui nomme ton fichier.

À toi d'écrire le code.