User Tools

Site Tools


projtec:gdb

Débogage, etc

Valgrind

Pour détecter les problèmes d'accès à la mémoire ou les fuites mémoires…

$ gcc -Wall -g -O0 monprog.c -o monprog
$ valgrind --leak-check=full ./monprog

Analyse statique de code avec cppcheck

$ cppcheck --enable=all --xml -I ../include *.c  2> report.xml
$ cppcheck-htmlreport --source-dir=. --report-dir=report --file=report.xml

⇒ Open 'report/index.html' to see the results.

Ici un exemple d'intégration dans CMake : https://gitlab-ce.iut.u-bordeaux.fr/PT4/DEMO-GIT-PT4/tree/master/Echecs-c++11

Utilisation de kcachegrind

$ valgrind --tool=callgrind program

⇒ callgrind.out.<pid>

$ kcahegrind callgrind.out.<pid> 

Compilation & Exécution avec GDB

Voici 4 cas de figures très classiques :

  • Votre programme plante à chaque exécution ? Réflexe : relancer le programme avec gdb et/ou valgrind.
  • Votre programme boucle à l'infinie à chaque exécution ? Réflexe : lancer le programme avec gdb, puis faire un “break” dans le programme pour voir ou ça boucle puis bt, next, print, watch …
  • Votre programme plante de temps en temps ? Réflexe : autoriser préalablement la génération des fichiers core (ulimit -c 100000) et lorsque le programme plante, lancer gdb sur le fichier core généré.
  • Votre programme boucle de temps en temps ? Réflexe : lancer gdb et attacher gdb au processus de votre programme.

Il est nécessaire au préalable de compiler son code C avec les CFLAGS “-g” et eventuellement “-O0” pour désactiver les optimisations du compilateur. Penser également à compiler avec “-Wall” pour afficher tous les warnings.

gcc -Wall -g -O0 monprog.c -o monprog
gdb ./monprog
(gdb) r

Memento GDB

  • quit (q) : quitter gdb
  • run [<arg1> <arg2> …], kill (r,k) : lancer l’execution, terminer l'exécution
  • break <func>, break [file:]line : introduire un point d’arrêt
  • clear, delete <numbp> (b,cl,d) : supprimer un point d'arrêt
  • watch <var> (w), rwatch <var>, awatch <var> : surveiller une variable en écriture, lecture ou les deux… entraîne l'arrêt du programme
  • step, next, continue, finish (s,n,c) : avancer d’un pas (en entrant ou pas dans les sous-fonctions), relancer jusqu’au prochain point d’arrêt, finir la fonction courante
  • print <var> (p) : afficher la valeur d’une variable
  • print *array@len : pour afficher len valeurs à partir de l'adresse de basse de array
  • list : afficher 10 lignes de code autour de l'instruction courante…
  • backtrace / frame <num> : afficher la pile d’execution, changer de frame, …
  • display <var> / undisplay <numvar> : suivre une variable et afficher sa valeur quand on fait du pas à pas…
  • x /xw <addr> : examiner le contenu de la mémoire à une adresse donnée dans un format spécifique : /xw affiche un word en hexa
  • call foo(1), call strlen(“pouet”) : appel de fonction
  • set var x = 1 : modification de la variable x
  • shell <cmd> : exécute une commande shell
  • file <program> : pour charger un programme depuis gdb
(gdb) list
(gdb) b numligne
(gdb) b fichier.c:numligne
(gdb) b nomfunction

Pour afficher quelques trucs :

(gdb) bt
(gdb) frame 2
(gdb) info args
(gdb) info locals
(gdb) p x

Utilisation d'un fichier core

ulimit -c 100000  # autoriser la création de fichier core de 100 MB 
./monprog         
segmentation fault! core dumped.
gdb ./monprog core
(gdb)

Attacher GDB à un processus

./monprog
ps            # on voit le pid 12271
gdb -p 12271

ou

gdb monprog 12271

ou

gdb monprog
(gdb) attach 12271

Autres Trucs

projtec/gdb.txt · Last modified: 2024/03/18 15:06 by 127.0.0.1