wiki:InsiaProgCDebug

Sommaire

Pratique - Debug et analyse

1. GDB

Le débugueur GDB peut être utilisé pour analyser le déroulement de n'importe quel programme. Si le programme analysé a été compilé avec les "informations de debug" (option -g de gcc), alors GDB peut également afficher de manière symbolique les informations analysées (numéro de ligne, nom de fonction, correspondance mémoire-variable, etc).

Il peut être invoqué après un "plantage", dans le cas où votre session est configurée pour autoriser la création des fichiers "core dump" (voir ulimit -c):

$ gdb programme
(gdb) core core

Le cas le plus courant reste le lancement du programme depuis le débugueur, permettant ainsi de piloter le programme et éventuellement l'analyser avant son plantage:

$ gdb programme
(gdb) set args 50 2050
(gdb) break fonction_douteuse
(gdb) run
Breakpoint 1, fonction_douteuse () at crash.c:2
(gdb) ...

Définir un point d'arrêt

(gdb) break ma_fonction
(gdb) break fichier.c:450

Afficher la pile d'appel, changer de contexte de fonction

(gdb) backtrace
#0  fonction_douteuse () at crash.c:2
#1  0x0804834c in main () at crash.c:9
(gdb) frame 1

Afficher des variables

(gdb) print ma_variable
(gdb) display argv (affichage permanent auto)
(gdb) info locals
(gdb) info args
(gdb) watch ma_variable (affichage en cours d'exécution)

Pas à pas, continuer

(gdb) next (ne rentre pas dans les fonctions)
(gdb) step (rentre dans les fonctions)
(gdb) continue
(gdb) finish

2. Valgrind

Valgrind est un programme qui implémente un processeur virtuel (il n'est disponible que pour les plateformes x86 et PPC), et combine des informations bas niveau (exécution machine) et haut niveau (informations du programme source) pour effectuer une analyse poussée de l'exécution d'un programme.

Il existe plusieurs types d'analyses disponibles avec cet outil, mais le plus populaire (et le seul initialement) est le test de mémoire. Il permet de détecter de nombreuses erreurs d'usage subtiles (voir la page de manuel). Exemple:

$ valgrind ./crash
==18879== Memcheck, a memory error detector.
...
==18879== Invalid write of size 1
==18879==    at 0x8048334: fonction_douteuse (crash.c:4)
==18879==    by 0x804834B: main (crash.c:9)
==18879==  Address 0xDEADBEEF is not stack'd, malloc'd or (recently) free'd
==18879== 
==18879== Process terminating with default action of signal 11 (SIGSEGV)
==18879==  Access not within mapped region at address 0xDEADBEEF
==18879==    at 0x8048334: fonction_douteuse (crash.c:4)
==18879==    by 0x804834B: main (crash.c:9)
...
Last modified 14 years ago Last modified on Nov 6, 2006, 12:21:49 AM