Déboguer un Segmentation Fault
D'abord une définition : « Une erreur de segmentation (en anglais segmentation fault, en abrégé segfault) est un plantage d'une application qui a tenté d'accéder à un emplacement mémoire qui ne lui était pas alloué. ».
Une bonne façon de les déboguer est d'utiliser un « Core dump ».
Il y a de forte chance que la fonctionnalité soit désactivée de base pour des raisons évidentes de sécurité. Pour l'activer temporairement, il faut utiliser la commande :
ulimit -S -c unlimited
Attention, cette modification n'est valable pour le terminal où elle est utilisée.
Pour tester, voici un programme qui plante (d'autres ici):
// C program to demonstrate segmentation fault
// by modifying a string literal
#include <stdio.h>
int main()
{
char* str;
// Stored in read only part of data segment //
str = "GfG";
// Problem: trying to modify read only memory //
*(str + 1) = 'n';
return 0;
}
Pour la compilation, ne pas oublier l'option « -g » pour ajouter les symboles.
gcc -o dumped dump.c -g
À l'exécution, nous avons bien le résultat attendu :
❯ ./dumped
zsh: segmentation fault (core dumped) ./dumped
On peut donc utiliser le déboguer gdb pour comparer le binaire et le « core dump » :
Type "apropos word" to search for commands related to "word"...
Reading symbols from dumped...
[New LWP 38697]
warning: Section `.reg-xstate/38697' in core file too small.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./dumped'.
Program terminated with signal SIGSEGV, Segmentation fault.
warning: Section `.reg-xstate/38697' in core file too small.
#0 main () at dump.c:14
14 *(str + 1) = 'n';
(gdb)
Et donc, gdb nous pointe bien la ligne en erreur.