Utilisation de GDB (debugger sous LINUX)

# GDB (https://openclassrooms.com/courses/deboguer-son-programme-avec-gdb)

Lancement d’une session
$ gdb program [dumpfile] [PID] [-silent|-q|-quiet]
Obtenir de l’aide sur une commande (une fois gdb lancé)
(gdb) help
Lancer l’exécution jusqu’au bout (ou jusqu’à la premiere erreur)
(gdb) run [args...]
Lancer l’exécution avec un point d’arret à l’entrée du programme
(gdb) start [args...]
Stopper l’exécution
(gdb) kill
Affiche la ligne d’arguments actuelle du programme.
(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

Les entrées et sorties

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>

Placer des points d’arrêt

Il y a trois façons de préciser un point d’arrêt :

  • breakpoints = indiquer un endroit précis (fonction, ligne, fichier) ;
  • watchpoints = lors de la modification d’une variable (ou à sa lecture) ;
  • catchpoints = lorsqu’un certain événement se produit (création d’un nouveau processus, chargement d’une librairie, throw ou catch d’une exception, etc.).

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]
Les breakpoints

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é :

  • en donnant un numéro de ligne (break 123) du fichier courant ;
  • en donnant un décalage en lignes par rapport à la prochaine instruction (break +5 #s’arrêter 5 lignes après la prochaine instruction) ;
  • en donnant un nom de fichier et un numéro de ligne (break monfichier.cpp:123) ;
  • en donnant un nom de fonction (break ma_fonction) ;
  • en donnant un nom de fichier et de fonction (break monfichier.cpp:ma_fonction) ;
  • en donnant une adresse (break *adresse #adresse peut être un nombre, une variable, une expression…).

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]
Ajouter un watchpoint

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
Supprimer un point d’arrêt

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
Continuer l’exécution

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
Examiner des variables

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 :

  • x : entier affiché en hexadécimal ;
  • d : entier signé ;
  • u : entier non-signé ;
  • o : entier affiché en octal ;
  • t : entier affiché en binaire ;
  • a : adresse ;
  • c : caractère ;
  • f : nombre à virgule flottante (float).
(gdb) print/<format> <variable>

Affiche le stack d’appel (liste des frames) avec, pour chaque frame, le contenu des variables locales.

(gdb) backtrace full
Exemple d’utilisation

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)
septembre 23rd, 2017 by