Utiliser le débogueur GDB

GDB
Ce document bla bla bla ...
© G. Landa, LAAS - CNRS
<georges.landa@laas.fr>

Compilation du programme à déboguer :

gcc -g -Wall -ansi -o exemple exemple.c

Débogage : chargement du programme

  • charger le programme : gdb exemple
  • lancer le débogueur puis charger le programme : gdb
    (gdb) file exemple
  • charger le programme et le core-file : gdb exemple core
  • charger le programme et un fichier d'instructions : gdb -x fichier\_de\_commandes exemple
  • charger le programme associé à un processus : gdb programme numéro\_de\_processus
  • quiter le débogueur : (gdb) quit

Lancer l'exécution du programme dans le débogueur

  • exécution simple : (gdb) run
  • exécution avec arguments : (gdb) run arguments
  • exécution avec point d'arrêt au début : (gdb) start
  • sauvegarde des outputs : (gdb) run -v -n 0 $>$ fichier.out
  • lecture de paramètres : (gdb) run $<$ fichier.in

Aide sur les commandes

  • Liste des classes de commandes : (gdb) help
  • Liste de toutes les commandes : (gdb) help all
  • Aide sur une commande : (gdb) help commande
  • Aide sur les commandes associées à un ``mo'' : (gdb) apropos mot

Commandes en vrac

Variables d'environnement

  • afficher les arguments : (gdb) show args
  • définir les arguments : (gdb) set args toto tata titi
  • variables d'environnement : (gdb) show env, (gdb) set env variable=valeur ou (gdb) unset env variable, (gdb) pwd, (gdb) cd répertoire

Points d'arrêt : breakpoints

Lorsqu'on veut arrêter le programme à un endroit précis.
  • met un break à l'appel de fct dans fichier : (gdb) break fichier:fct
  • met un break ligne 20 de fichier : (gdb) break fichier:20
  • met un break 3 lignes après la prochaine instruction : (gdb) break +3
  • met un break à l'adresse indiquée : (gdb) break *(0x65AB43 + variable)
  • execute jusqu'au point d'arrêt suivant : (gdb) continue
  • liste les points d'arrêts : (gdb) info breakpoints
  • efface le point d'arrêt correspondant : (gdb) delete numero_pt_arret
  • efface le point d'arrêt spécifié par nom de fonction : (gdb) clear nom\_de\_fonction
  • désactive temporairement : (gdb) disable numero_pt_arret
  • active temporairement : (gdb) enable numero_pt_arret
  • arrêt conditionnel : (gdb) break ligne\_ou\_fonction if condition (ex.: break 100 if x > 10)
  • transforme le point d'arrêt en pt d'arrêt conditionnel : (gdb) cond numero_pt_arret condition
  • idem que print mais ré-affiche à chaque point d'arrêt du programme : (gdb) display
  • annule l'affichage : (gdb) undisplay
  • affiche les expression faisant l'objet d'un display : (gdb) info display
  • (gdb) disable disp numero\_display
  • (gdb) enable disp numero\_display
  • arrêt temporaire, le programme ne s'arrête qu'une fois : (gdb) tbreak
  • arrête après passer N fois à numero_pt_arret : (gdb) ignore bp numero_pt_arret
  • examine le contenu de la mémoire : (gdb) x argv[0]

watchpoints

  • permet de mettre un point d'observation, gdb s'arrête dès que la variable est modifiée : (gdb) watch variable
    ou (gdb) watch expression
    par ex: watch (i $i<$ 2 && argv[i] =="-h") sera déclenché lorsque l'expression est vraie quel que soit l'endroit du programme
  • arrêt lorsqu'une variable est lue : (gdb) rwatch variable
  • arrêt lorsqu'une variable est lue ou modifiée : (gdb) awatch variable

Examen des variables, registres \dots

  • état de la pile au plantus : (gdb) backtrace ou where
  • affiche d'une variable : (gdb) print x ou print M[i][j]
  • affiche x au format Z : Z= d=decimal, o=octal, x=hexa, c=caractère, f=flottant, t=binaire : (gdb) print/Z x
  • permet de réutiliser un résultat de l'affichage numéro i : (gdb) \$i
  • les dix derniers affichages : (gdb) show values
  • le dernier affichage : (gdb) \$
  • l'avant dernier : (gdb) \$\$
  • permet d'afficher une longueur de mémoire : print M[0]@N : affiche M[0] jusqu'à M[N-1] : (gdb) \@
  • affiche la variable x de la fonction fct : (gdb) print fct::x
  • affiche le résultat de la fonction toto avec les arguments (M,3,2) : ainsi que la valeur retournée par la fonction : (gdb) print toto(M,3,2)
  • affiche le type d'une variable : (gdb) whatis
  • affiche le détail d'une structure, union , enumeration : (gdb) ptype
  • affiche le prototype de la fonction toto : (gdb) info func toto
  • déplacement dans la pile des appels : (gdb) up et down
  • permet de se placer au numero N dans la pile : (gdb) frame N

Déroulement du programme

  • exécution pas à pas : (gdb) next
  • idem mais rentre dans les fonctions : (gdb) step
  • termine la fonction en cours et s'arrête après le retour : (gdb) finish
  • exécute un shell avec commande : (gdb) shell commande
  • attache le programme de PID N en cours d'exécution : (gdb) attach N
  • détache le programme : (gdb) detach
  • affiche le listing de l'endroit du programme où on se trouve : (gdb) list
  • exécute jusqu'à la prochaine ligne : (gdb) until
  • tuer le programme : (gdb) kill

Utiliser plusieurs terminaux

  • Affichage du terminal courant : (gdb) show inferior-tty
  • choix du terminal pour les sorties du programme débogué : (gdb) tty /dev/pts/3

Executer automatiquement des commandes aux points d'arrêts N


(gdb) commands N
> commande\_1
> commande\_2
> ...
> end

exemple : 
(gdb) commands 1
> echo valeur de i 
> print i
> echo valeur de j 
> print j
> ...
> continue
> end
(gdb)

Historique des commandes

  • active l'historique : (gdb) set history expansion
  • rappelle la dernière commande : (gdb) !!
  • rappelle la dernière commande commançant par z : (gdb) !z

Divers

  • supprime l'affichage de certains messages : (gdb) silent
  • insertion d'un commentaire : (gdb) \# commentaire