我怎样才能让GDB告诉我哪个地址导致了段错?

时间:2010-06-09 05:46:37

标签: c gdb

我想知道我的程序是否正在访问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 ?? ()

2 个答案:

答案 0 :(得分:59)

使用GDB 7及更高版本,您可以检查信号发生时填写的$_siginfo结构,并确定错误地址:

(gdb) p $_siginfo._sifields._sigfault.si_addr

如果它显示(void *) 0x0(或一个小数字),那么你有一个NULL指针取消引用。

答案 1 :(得分:-1)

在GDB下运行您的程序。当发生段错误时,GDB会通知您程序的行和语句,以及变量及其相关地址。

您可以使用GDB中的“print”(p)命令来检查变量。如果在库调用中发生崩溃,您可以使用“frame”系列命令来查看相关的堆栈帧。