François Trahay
But: comprendre l’exécution d’un programme
12
? Ca devrait être 17, non
?printf("entrée dans foo(n=%d)\n", n);
dans le
code source$ ./sigsegv
Debut du programme
Erreur de segmentation
$ gdb ./sigsegv
[...]
(gdb) run
Starting program: ./sigsegv
Debut du programme
Program received signal SIGSEGV, Segmentation fault.
0x000000000040050b in main (argc=1, argv=0x7fffffffdd68) at sigsegv.c:7
7 *ptr=5;
(gdb) print ptr
$1 = (int *) 0x0
-g
gdb
:
gdb ./programme
r
(ou run
)Ctrl+C
q
(ou quit
)La commande bt
(ou backtrace
)
#x
avec la
commande frame [x]
. (gdb) bt
#0 baz (a=2) at backtrace.c:7
#1 0x0000000000400581 in bar (n=5, m=3) at backtrace.c:15
#2 0x00000000004005ae in foo (n=4) at backtrace.c:21
#3 0x0000000000400559 in baz (a=5) at backtrace.c:9
[...]
p [var]
(ou print [var]
)
[var]
display [var]
[var]
à chaque arrêt du
programme[var]
peut être une variable (eg.
p n
)[var]
peut être une expression (eg.
p ptr->next->data.n
)Une fois le programme lancé, possibilité d’exécuter les instructions une par une:
n
(ou next
) : exécute la prochaine
instruction, puis arrête le programme.s
(ou step
) : idem. Si l’instruction est
un appel de fonction, ne descend pas dans la fonction.c
(ou continue
) : continue l’exécution du
programme (arrête le mode pas à pas)b fichier.c:123
watch x
ptr
ne devrait pas être NULL
!
Qui a fait ça ?”valgrind [programme]
Outre valgrind, vous pouvez utiliser des sanitizers pour repérer des soucis dans votre code:
AddressSanitizer
: détecte les accès hors-tableau, et
l’utilisation des pointeurs après la libération
-fsanitize=address
Undefined
: détecte divers comportements non-définis,
notamment avec les pointeurs
-fsanitize=undefined
Memory
: détecte des accès à de la mémoire non
initialisée
-fsanitize=memory
foo
désigne l’adresse de la fonction
int foo(int a, char b);
int (*function_ptr)(int a, char b) = foo;
function_ptr(12, 'f'); // appelle la fonction foo
1 Oui, c’est sans rapport avec le debugging, mais pour équilibrer les séances, nous avons préféré ne pas aborder cette notion lors du cours sur les pointeurs :-)