# GDB (https://openclassrooms.com/courses/deboguer-son-programme-avec-gdb)
$ gdb program [dumpfile] [PID] [-silent|-q|-quiet]
(gdb) help
(gdb) run [args...]
(gdb) start [args...]
(gdb) kill
(gdb) show args
Règle la ligne d’arguments à « arguments » (vous pouvez aussi passer les arguments comme paramètres à start ou run).
(gdb) set args arguments
Si votre programme utilise les entrées et sorties standards, les opérations d’entrée et de sortie seront effectuées dans le même terminal que GDB. Vous pouvez, pour plus de clarté par exemple, changer le terminal du programme exécuté.
A NOTER : il faut ouvrir au préalable le terminal à utiliser et taper la commande tty pour connaitre son identifiant. Ensuite dans la console gdb , taper la commande tty <terminal>
(gdb) tty <terminal>
Il y a trois façons de préciser un point d’arrêt :
Affiche la liste des points d’arrêt. Si vous précisez un numéro (et non une position), vous ne verrez que les infos qui concernent ce point d’arrêt.
(gdb) info break [breaknum]
Si on ne donne pas de position, GDB s’arrêtera à la prochaine instruction qui sera exécutée. Sinon on peut spécifier l’endroit où le programme sera arrêté :
Exemple : « (gdb) break *(0x80F523 + maVariable).
(gdb) break [position]
Supprime le breakpoint correspondant à la position indiquée. Comme précédemment, ne pas indiquer de position suppose qu’il s’agit de l’instruction suivante.
(gdb) clear [position]
Indique à GDB de s’arrêter dès que la variable est modifiée. L’instruction qu’il vous affiche correspond donc à celle qui sera exécutée juste après (et non pas à celle qui a modifié la variable, puisqu’elle a déjà été exécutée).
Vous pouvez également utiliser une expression, par exemple « a*b », pour indiquer à GDB de ne s’arrêter que lorsque (a*b) aura été modifié. Mais il faut bien noter que pour surveiller une expression, GDB est obligé de surveiller chaque variable de cette expression et d’évaluer le résultat.
(gdb) watch variable
Indique à GDB de s’arrêter dès que la variable est accédée par le programme (r pour « read »).
(gdb) rwatch variable
Indique à GDB de s’arrêter aussi bien lorsque la variable est modifiée que lorsqu’elle est lue.
(gdb) awatch variable
Dans les commandes suivantes, si [breaknum] n’est pas spécifié, cela signifie « tous les points d’arrêt ».
Supprime le point d’arrêt numéro « breaknum ».
(gdb) delete [breaknum]
Désactive un point d’arrêt, mais ne le supprime pas (GDB ne s’arrêtera pas, mais vous pourrez toujours le réactiver par la suite).<
(gdb) disable [breaknum]
Active un point d’arrêt.
(gdb) enable [breaknum]
Active un point d’arrêt pour un seul passage. Dès qu’il est atteint une fois, il est désactivé automatiquement.
(gdb) enable [breaknum] once
Active un point d’arrêt pour un seul passage. Dès qu’il est atteint une fois, il est automatiquement supprimé.
(gdb) enable [breaknum] delete
Exécute les [count] prochaines lignes de code. Si count n’est pas spécifié, il vaut 1. Si l’instruction est un appel de fonction, step va passer à l’intérieur de cette fonction. Attention cependant, step ne peut aller que dans les fichiers qui ont des informations de débogage (il a besoin des numéros de ligne).
(gdb) step [count]
Comme « step », exécute les [count] prochaines lignes de code. La différence étant que si l’instruction est un appel de fonction, next ne s’arrêtera pas à l’intérieur de celle-ci, mais bien à la ligne suivant l’appel de la fonction.
(gdb) next [count]
Exécute toutes les instructions jusqu’à ce que le programme arrive à une ligne qui suit la ligne actuelle. C’est utile dans le cas de boucles.
(gdb) until
A noter : attention à la portée de la variable. Si on est dans une fonction et qu’on souhaite voir le contenu d’une variable de la fonction appelante il faut faire <fct>::<variable>
(gdb) print <variable>
On peut demander à afficher des variable dans un format particulier
Les formats sont les suivants :
(gdb) print/<format> <variable>
Affiche le stack d’appel (liste des frames) avec, pour chaque frame, le contenu des variables locales.
(gdb) backtrace full
Le programme génère une erreur d’utilisation de pointeur.
(gdb) tty /dev/pts/1 (gdb) run Starting program: /home/joelb/workspace/projet_c/mymusiccollector/bin/musiccollector-debug Program received signal SIGSEGV, Segmentation fault. 0x08048706 in create_track (pxTrack=0xb7ff0950, pxName=0x80489d5 "toto", xDuration=120, xYear=2012, pxArtiste=0x0, pxAlbum=0x0) at ./src/piste/com/piste.c:20 20 pxTrack->pName = malloc(sizeof(pxName)); (gdb)