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 ./programmer (ou run)Ctrl+Cq (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:123watch xptr 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=addressUndefined: détecte divers comportements non-définis,
notamment avec les pointeurs
-fsanitize=undefinedMemory: détecte des accès à de la mémoire non
initialisée
-fsanitize=memoryfoo 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 foo1 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 :-)