+1 untuk jawaban Tibors.
Pada program yang lebih besar atau jika Anda menggunakan pustaka tambahan, mungkin juga berguna lihat backtrace dengan gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html
Gunakan debugger, seperti gdb
atau jika ini tidak berlaku strace
alat untuk mendapatkan wawasan yang lebih baik tentang di mana segfault terjadi.
Jika Anda menggunakan gcc
, pastikan Anda mengkompilasi dengan -g
beralih untuk memasukkan informasi debug. Lalu, gdb
akan menunjukkan kepada Anda lokasi yang tepat dalam kode sumber di mana segfault.
Misalnya, jika kita memiliki program segfaulty yang jelas ini:
baru.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
Kami mengkompilasinya dengan gcc -g new.c -o new
lalu jalankan gdb
sesi dengan gdb new
:
Kami menerbitkan run
perintah dalam sesi interaktif dan yang lainnya jelas:
(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)
Seperti yang ditunjukkan oleh DasMoeh dan netcoder, ketika segfault terjadi, Anda dapat menggunakan backtrace
perintah dalam sesi interaktif untuk mencetak tumpukan panggilan. Ini dapat membantu dalam menentukan lebih jauh lokasi segfault.
Cara termudah adalah dengan menggunakan valgrind
. Ini akan menunjuk ke lokasi di mana akses tidak valid terjadi (dan masalah lain yang tidak menyebabkan crash tetapi masih tidak valid). Tentu saja masalah sebenarnya bisa berada di tempat lain dalam kode (misalnya:pointer tidak valid), jadi langkah selanjutnya adalah memeriksa sumbernya, dan jika masih bingung, gunakan debugger.