Ce facem cand programul nostru la un moment afiseaza mesajul:
Segmentation fault
?
O metoda simpla dar destul de laborioasa ar fi sa folosim "printf"-uri si sa depistam linia unde "crapa". Aplicand aceasta metoda o sa gasim ultima linie care produce output, astfel putem depista ultima linie care se executa si produce acest eveniment!

Folosind gdb (The GNU Debugger) gasim aceasta linie mai rapid.
Ca si studiu folosim urmatorul exemplu:
test.c:
#include <stdio.h>
int
main(){
  
int
n;
  printf(
"Dati n: "
);
  scanf(
"%d"
,n);
  printf(
"Valoare lui n este: %d\n"
,n);
  
return
0;

}
Dupa compilare (gcc -o test test.c), rulam programul (./test), iar dupa citirea lui n, obtinem:
Dati n: 2
Segmentation fault
Pentru a depista problema:
  1. Trebuie sa configuram sistemul ca atunci cand programul nostru produce "Segmentation fault" sa ne salveze imaginea din memorie a programului din momentul respectiv.
    Daca folosim bash ca si interpretor de comenzi, utilizind:
    ulimit -c unlimited
    modificam aceasta proprietate.
  2. Recompilam programul nostru sa includa si informatie de debug
    gcc -g -o test test.c
    si rulam:
    ./test
    Dati n: 2
    Segmentation fault (core dumped)
    Observam ca spre deosebire de prima rulare sistemul a produs un fisier core:
    ls -1 core* produce:
    core.30881

    Aici 30881 fiind pid-ul progamului nostru.
    Atentie:
    Sa nu alegem un fisier core mai vechi! (Indicat este ca inainte de pasul 2 sa stergem fisierele core din directorul curent (rm core.*).
  3. Folosind gdb putem examina acest fisier astfel:
    gdb test core.30881
    (syntaxa fiind: gdb nume_executabil nume_fisier_core)
    Ruland aceasta comanda obtinem un output de genul:
    GNU gdb Fedora (6.8-32.fc10)
    Copyright (C) 2008 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law. Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "i386-redhat-linux-gnu"...
    (no debugging symbols found)

    warning: Can't read pathname for load map: Input/output error.
    Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
    Loaded symbols for /lib/libc.so.6
    Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
    Loaded symbols for /lib/ld-linux.so.2
    (no debugging symbols found)
    Core was generated by `./test'.
    Program terminated with signal 11, Segmentation fault.
    [New process 30881]
    #0 0x00c021d0 in _IO_vfscanf_internal () from /lib/libc.so.6
    Missing separate debuginfos, use: debuginfo-install glibc-2.9-3.i686
    (gdb)

    Dupa ce apare promterul debugger-ului folosim comanda: backtrace (sau prescurtarea bt) pentru a vizualiza stiva de executie:

    (gdb)
    bt

    #0 0x00c021d0 in _IO_vfscanf_internal () from /lib/libc.so.6
    #1 0x00c0d438 in scanf () from /lib/libc.so.6
    #2 0x08048424 in main () at test.c:5

    Pe prima coloana ne este prezentat numarul frame-ului din stiva de executie iar la sfarsitul fiecarei linii ne este prezentat fisierul sursa si numarul liniei la care s-a oprit executia.
    In stiva de executie programul nostru apare doar in frame-ul 2.

    Daca vrem sa examinam anumite variabile, pentru a vedea starea lor din momentul rularii, trebuie sa schimbam frame-ul curent, folosim comanda: frame nr_frame

    (gdb)
    frame 2

    #2 0x08048424 in main () at test.c:5
    5 scanf("%d",n);
    (gdb)

    Aici observam ca la linia 5 s-a produs citirea variabilei n, in acest caz este evident: n nu a fost citit corespunzator.
    In cazul general putem examina anumite variabile folosind comanda: print nume_variabila:

    (gdb)
    print n

    $1 = 12175056
    (gdb)
  4. Pentru a parasii sesiunea gdb folosim comanda: quit sau q
    (gdb)
    q
Folosind aceasta metoda putem depista relativ usor unde s-a produs evenimentul "Segmentation fault".
Pentru mai multe informatii despre gdb folositi man gdb sau tutorialul de aici.