+1 per la risposta di Tibors.
Su programmi più grandi o se usi librerie aggiuntive potrebbe anche essere utile guardare il backtrace con gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html
Usa un debugger, come gdb
o se questo non è applicabile un strace
strumento per ottenere una migliore comprensione di dove si verifica il segfault.
Se usi gcc
, assicurati di compilare con -g
switch per includere le informazioni di debug. Quindi, gdb
ti mostrerà la posizione esatta in un codice sorgente in cui si verifica il segfault.
Ad esempio, se abbiamo questo ovvio programma difettoso di segmentazione:
nuovo.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
Lo compiliamo con gcc -g new.c -o new
e poi esegui gdb
sessione con gdb new
:
Emettiamo run
comando nella sessione interattiva e il resto è chiaro:
(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]
Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6 printf("%d", *i);
(gdb)
Come hanno sottolineato DasMoeh e netcoder, quando si è verificato un segfault, puoi usare backtrace
comando nella sessione interattiva per stampare uno stack di chiamate. Questo può aiutare a individuare ulteriormente la posizione di un segfault.
Il modo più semplice è usare valgrind
. Indicherà la posizione in cui si verifica l'accesso non valido (e altri problemi che non hanno causato l'arresto anomalo ma erano comunque non validi). Ovviamente il vero problema potrebbe essere da qualche altra parte nel codice (ad esempio:puntatore non valido), quindi il passaggio successivo è controllare il sorgente e, se ancora confuso, utilizzare un debugger.