在GDB中出现SegFault后如何继续调试?

5

我正在使用GDB调试一个大型程序,其中发生了段错误(SegFault)。 在不重新运行程序的情况下,有没有可能切换到先前的堆栈帧并从那里继续执行?

2个回答

8
在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)

1

这是关于编程的问题,内容如下:

是否可以切换到先前的堆栈帧并从那里继续执行?

是的,您可以使用反向调试来实现。

当您遇到段错误时,请运行reverse-finish以反向方式退出当前帧。您将停在先前的帧中,在那里您即将调用导致段错误的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接