Poly: update with remarks
This commit is contained in:
parent
2b831dc3f2
commit
1bfb8b9eb9
|
@ -4,8 +4,8 @@ author: "Théophile Bastian \\texttt{<theophile.bastian@inria.fr>}"
|
|||
date: "\\vspace{-1em}"
|
||||
lang: fr
|
||||
geometry:
|
||||
- top=2cm
|
||||
- bottom=2cm
|
||||
- top=1.5cm
|
||||
- bottom=1.5cm
|
||||
- left=2cm
|
||||
- right=2cm
|
||||
pagestyle: empty
|
||||
|
|
25
poly/poly.md
25
poly/poly.md
|
@ -2,9 +2,12 @@
|
|||
|
||||
Une *segfault* -- *segmentation fault*, ou *erreur de segmentation* -- apparaît
|
||||
quand un programme essaye d'accéder à une zone mémoire qui ne lui est pas
|
||||
allouée. C'est une erreur fréquente dès lors qu'on manipule des pointeurs, et
|
||||
elle est plus difficile à corriger qu'un bug classique -- en tout cas quand on
|
||||
n'a pas les bons réflexes !
|
||||
allouée\footnote{À noter que si une segfault est toujours due à un accès à de
|
||||
la mémoire non allouée, l'inverse n'est pas vrai : parfois, un tel accès ne
|
||||
résulte pas en une segfault, et peut par exemple corrompre une autre variable
|
||||
du programme.}. C'est une erreur fréquente dès lors qu'on manipule des
|
||||
pointeurs, et elle est plus difficile à corriger qu'un bug classique -- en tout
|
||||
cas quand on n'a pas les bons réflexes !
|
||||
|
||||
Elle arrive par exemple dans les cas suivants :
|
||||
|
||||
|
@ -117,11 +120,9 @@ nous indique, de bas en haut, que :
|
|||
* on crash (segfault)
|
||||
|
||||
La première ligne nous indique la position du bug, les lignes suivantes nous
|
||||
indiquent d'où on vient dans le programme.
|
||||
|
||||
C'est certes peu d'informations (la ligne de l'erreur seulement -- pas la
|
||||
variable concernée, etc), mais c'est déjà mieux que juste `Segmentation fault
|
||||
(core dumped)`, et souvent suffisant.
|
||||
indiquent d'où on vient dans le programme. C'est certes peu d'informations (la
|
||||
ligne de l'erreur seulement -- pas la variable concernée, etc), mais c'est déjà
|
||||
mieux que juste `Segmentation fault (core dumped)`, et souvent suffisant.
|
||||
|
||||
# Si c'est plus compliqué : gdb
|
||||
|
||||
|
@ -151,8 +152,8 @@ Program received signal SIGSEGV, Segmentation fault.
|
|||
`gdb` nous dit qu'on a une *segfault* dans `afficher_liste`, ligne 20 de
|
||||
`exemple.c` -- rien de nouveau. Il nous donne les valeurs des arguments de
|
||||
cette fonction (`taille=3`, et une adresse pour `tete`). Mais surtout, *on
|
||||
reste en mode interactif* ! On peut lui demander la même chose qu'à `valgrind`,
|
||||
savoir d'où on vient :
|
||||
reste en mode interactif* ! On peut lui demander ce que `valgrind` affichait spontanément,
|
||||
la *backtrace* (savoir d'où on vient) :
|
||||
|
||||
```GDB
|
||||
(gdb) backtrace
|
||||
|
@ -166,6 +167,10 @@ On peut lui demander d'afficher des valeurs *au moment du crash* :
|
|||
2
|
||||
(gdb) print cur
|
||||
(liste_t *) 0x0
|
||||
(gdb) print &(liste->suivant) # On peut écrire des expressions C compliquées
|
||||
(struct liste **) 0x5555555592a0
|
||||
(gdb) print liste->suivant->valeur + 42 - taille # aussi compliquées qu'on veut
|
||||
41
|
||||
```
|
||||
|
||||
...ou la même chose, mais dans `main`, au moment de l'appel de fonction :
|
||||
|
|
Loading…
Reference in New Issue