Se mettre à GDB en 5 minutes


Sommaire


1/ Qu'est-ce que GDB ?

GDB est l'acronyme de Gnu DeBugger. C'est un debugger puissant dont l'interface est totalement en ligne de commande, c'est à dire avec une invite en texte. GDB est tellement apprécié qu'on le trouve aussi encapsulé dans des interfaces graphiques, comme XXGDB ou DDD. GDB est publié sous la licence GNU et gratuit. Son code source est disponible... pour les fous!

2/ Compilation pour déboguer

j'ai compilé un programme titi. Pour obtenir des informations de trace avec le debugger, je le compile avec l'option `-g' et sans optimisation de compilation (style -O2) :
$ gcc -g titi.c -o titi

3/ Démarrage

Mon programme fait un core dump à l'exécution... que faire ? J'utilise le debugger GDB du GNU de la manière suivante :
$ gdb titi core
GDB charge tout ce dont il a besoin... et me présente une invite (gdb).

4/ Une situation pratique

Je peux mettre un `breakpoint' dans la fonction critique de mon programme. Disons que cette fonction s'appelle tutu. je tape sous GDB :

(gdb) b tutu

b veut dire breakpoint. GDB me répond :
Breakpoint 1 at 0x80de41c: file titi.c, line 1309.

Je peux spécifier plutot une ligne (ex : 134) de mon programme :

(gdb) b titi.c:134

Maintenent je lance mon programme sous GDB :

(gdb) r

r veut dire run, d'ailleurs run marche aussi. On peut aussi taper r bibi pour donner en argument à titi la chaine `bibi' (ex : nom de fichier). GDB me répond :
Starting program: /home/benoit/src/titi bibi

Pouf, le programme stoppe sur le breakpoint. On y va pas à pas avec la commande n ou next et pour entrer dans les sous-functions, on fait un step ou s. Après on peut taper sur enter : ça répète la dernière commande.

(gdb) n

GDB me répond en m'affichant la ligne en cours :
1350 if (Array1[i]!=i)
Et en plus, il conserve l'indentation du source. Disons que je veux vérifier la valeur de `i' :

(gdb) print i

ou bien p i car p veut dire print. GDB me répond : $1 = 6
$1 veut dire que c'est la première fois que j'invoque `i' ...qui est égal à 6. Je peux imprimer la valeur de TralalaBibapelOula en tapant seulement p Trala[tab] et gdb complète automatiquement ou me propose la liste des variables qui commencent par Trala... Je liste la fonction bibi pour me souvenir ce que cela fait :

(gdb) l bibi

Et pof, ca me liste quelques lignes de bibi.

(gdb) l bibi,141

Et plaf, j'ai jusqu'à la ligne 141 pour y voir plus clair. pour voir plus loin, tapons l+ ou l + pour dire "liste m'en plus". Et du coup GDB continue par paquet de dix lignes. Bon, continuons l'execution avec la commande continue ou c.

(gdb) c

Continuing.

On peut interrompre l'execution pour retouver l'invite en tapant Ctrl-c.
Pour avancer par pas de X instructions, il suffit de taper
(gdb) n X
C'est pratique pour les boucles !

[...]

Et hop plaf boum, le core dump apparait ! GDB nous invite à réfléchir... voyons la pile des appels des fonctions pour mieux zoomer l'endroit de l'erreur de segmentation :
(gdb) bt
bt veut dire `backtrace'. On peut taper where c'est-à-dire `où suis-je?'. De là, on peut monter ou descendre dans les appels de fonctions : up permet de monter dans le contexte de la function appelante. down permet de descendre dans vers la fonction appelée. Cela nous permet donc de se trouver dans le contexte de n'importe quelle fonction liée au core dump. On peut imprimer les variables que l'on veut dans le contexte courant avec la commande print ou p. Bon, c'est ben sympatique, mais je veux voir le source car c'est plus parlant! Pas de problème, il suffit de lister quelques lignes:

(gdb) l titi.c:bibi

Cela liste 10 lignes de la fonction `bibi'

(gdb) l titi.c:30

Cela liste les lignes n°25 à 35 de titi.c

[...]

Pour quitter GDB, il suffit de taper q. GDB a de nombreuses commandes. pour en savoir plus, il suffit de taper `h' et il vous propose une liste de thèmes. tapez alors :

(gdb) h `le thème voulu'

Pour devenir un pro de GDB, visitez le site http de référence de GDB . Là vous saurez tout sur GDB ! Voilà... Mais surtout n'oubliez jamais de compiler avec l'option de debuggage...`-g' pour gcc.


Copyright © 2000 Benoit Rouits