【问题标题】:Continue debugging after SegFault in GDB?在 GDB 中的 SegFault 之后继续调试?
【发布时间】:2019-10-14 10:27:56
【问题描述】:

我正在使用 GDB 调试一个巨大的程序,我的程序中有一个 SegFault。 除了重新运行程序,是否可以切换到之前的堆栈帧并从那里继续执行?

【问题讨论】:

    标签: gdb


    【解决方案1】:

    至少在 Unix 和 Linux 系统上,您可以使用 gdb 的 handle 命令告诉 gdb 在收到信号时停止程序(使用 stop 关键字)并且不要将信号传递给程序( nopass 关键字)。当程序停止时,您可以使用return 命令从当前帧返回一个值,然后继续程序。

    $ gdb -q segvtest
    Reading symbols from segvtest...done.
    (gdb) list 1,99999
    1       #include <stdio.h>
    2
    3       int a()
    4       {
    5               int *p = 0;
    6               return *p;
    7       }
    8
    9       int main()
    10      {
    11              int i = a();
    12              printf("a() returned %d\n", i);
    13      }
    (gdb) handle SIGSEGV stop nopass
    Signal        Stop      Print   Pass to program Description
    SIGSEGV       Yes       Yes     No              Segmentation fault
    (gdb) run
    Starting program: /home/mp/segvtest
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000080006c0 in a () at segvtest.c:6
    6               return *p;
    (gdb) return 12345
    Make a return now? (y or n) y
    #0  0x00000000080006d6 in main () at segvtest.c:11
    11              int i = a();
    (gdb) c
    Continuing.
    a() returned 12345
    [Inferior 1 (process 74) exited normally]
    (gdb)
    

    【讨论】:

      【解决方案2】:

      是否可以切换到上一个堆栈帧并继续 从那里执行?

      是的,您可以使用reverse debugging

      当您遇到段错误时,运行reverse-finish 以反向退出当前帧。您将在即将调用导致段错误的函数的上一帧中停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多