【发布时间】:2019-10-14 10:27:56
【问题描述】:
我正在使用 GDB 调试一个巨大的程序,我的程序中有一个 SegFault。 除了重新运行程序,是否可以切换到之前的堆栈帧并从那里继续执行?
【问题讨论】:
标签: gdb
我正在使用 GDB 调试一个巨大的程序,我的程序中有一个 SegFault。 除了重新运行程序,是否可以切换到之前的堆栈帧并从那里继续执行?
【问题讨论】:
标签: gdb
至少在 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)
【讨论】:
是否可以切换到上一个堆栈帧并继续 从那里执行?
是的,您可以使用reverse debugging。
当您遇到段错误时,运行reverse-finish 以反向退出当前帧。您将在即将调用导致段错误的函数的上一帧中停止。
【讨论】: