我想知道我的程序是否正在访问NULL指针或过时的内存。
回溯看起来像这样:
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x2b0fa4c8 (LWP 1333)] 0x299a6ad4 in pthread_mutex_lock () from /lib/libpthread.so.0 (gdb) bt #0 0x299a6ad4 in pthread_mutex_lock () from /lib/libpthread.so.0 #1 0x0058e900 in ?? ()
答案 0 :(得分:59)
使用GDB 7及更高版本,您可以检查信号发生时填写的$_siginfo
结构,并确定错误地址:
(gdb) p $_siginfo._sifields._sigfault.si_addr
如果它显示(void *) 0x0
(或一个小数字),那么你有一个NULL指针取消引用。
答案 1 :(得分:-1)
在GDB下运行您的程序。当发生段错误时,GDB会通知您程序的行和语句,以及变量及其相关地址。
您可以使用GDB中的“print”(p)命令来检查变量。如果在库调用中发生崩溃,您可以使用“frame”系列命令来查看相关的堆栈帧。