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

nor*_*gon 40 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 ?? ()

caf*_*caf 62

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

(gdb) p $_siginfo._sifields._sigfault.si_addr
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`ptype $ _siginfo`来查看结构中的其他内容. (2认同)