代码之家  ›  专栏  ›  技术社区  ›  nornagon

如何让gdb告诉我是哪个地址导致了segfault?

gdb c
  •  34
  • nornagon  · 技术社区  · 14 年前

    我想知道我的程序是否正在访问空指针或过时的内存。

    回溯如下:

    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 回复  |  直到 14 年前
        1
  •  54
  •   caf    14 年前

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

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

    如果它显示 (void *) 0x0 (或一个小数字)然后您有一个空指针取消引用。

        2
  •  -1
  •   Yann Ramin    14 年前

    在gdb下运行程序。当segfault发生时,gdb将通知您程序的行和语句,以及变量及其相关地址。

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