====== Débogage, etc ====== * GDB : https://moodle1.u-bordeaux.fr/pluginfile.php/268787/mod_resource/content/1/gdb-refcard-v5.pdf * Valgrind : http://valgrind.org/docs/manual/quick-start.html * KCacheGrind : http://kcachegrind.sourceforge.net/html/Home.html * cppcheck (analyse statique de code, linter) : http://cppcheck.sourceforge.net/ * GCov ==== 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. $ kcahegrind callgrind.out. ==== 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 [ ...], kill (r,k) : lancer l’execution, terminer l'exécution * break , break [file:]line : introduire un point d’arrêt * clear, delete (b,cl,d) : supprimer un point d'arrêt * watch (w), rwatch , awatch : 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 (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 : afficher la pile d’execution, changer de frame, ... * display / undisplay : suivre une variable et afficher sa valeur quand on fait du pas à pas... * x /xw : 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 : exécute une commande shell * file : 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 ==== * Ctrl-X Ctrl-A : ouvre une petite fenêtre avec le code source paginée, qui suit l'instruction courante... * Refcard : http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf