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.