+1 pro Tiborovu odpověď.
U větších programů nebo pokud používáte další knihovny, může být také užitečné podívat se na backtrace s gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html
Použijte debugger, například gdb
nebo pokud to neplatí, strace
nástroj k získání lepšího přehledu o tom, kde k segfaultu dochází.
Pokud použijete gcc
, ujistěte se, že kompilujete s -g
přepnout, aby zahrnoval informace o ladění. Poté gdb
vám ukáže přesné umístění ve zdrojovém kódu, kde segfaults.
Například, pokud máme tento zjevně segfaultový program:
new.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
Zkompilujeme jej pomocí gcc -g new.c -o new
a poté spusťte gdb
relace s gdb new
:
Vydáváme run
příkaz v interaktivní relaci a ostatní je jasné:
(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)
Jak zdůraznili DasMoeh a netcoder, když dojde k chybě segfault, můžete použít backtrace
příkaz v interaktivní relaci pro tisk zásobníku volání. To může pomoci k dalšímu určení místa segfault.
Nejjednodušší způsob je použít valgrind
. Zjistí místo, kde se vyskytuje neplatný přístup (a další problémy, které nezpůsobily pád, ale byly stále neplatné). Samozřejmě skutečný problém může být někde jinde v kódu (např.:neplatný ukazatel), takže dalším krokem je zkontrolovat zdroj, a pokud je to stále zmatené, použijte debugger.