在GDB中出现SEGDFAULT后是否继续调试?

在GDB中出现SEGDFAULT后是否继续调试?,gdb,Gdb,我正在用GDB调试一个巨大的程序,我的程序中有一个SegFault。 不需要重新运行程序,是否可以切换到上一个堆栈帧并从那里继续执行 是否可以切换到上一个堆栈帧并继续 从那里处决 是的,你可以用它 当获得segfault时,运行反向完成以反向退出当前帧。您将在上一帧中停止调用导致segfault的函数。在Unix和Linux系统上,至少可以使用gdb的命令在收到信号时告诉gdb停止程序(使用stop关键字),不要将信号传递给程序(使用nopass关键字)。当程序停止时,您可以使用命令从当前帧返回

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

是否可以切换到上一个堆栈帧并继续 从那里处决

是的,你可以用它


当获得segfault时,运行
反向完成
以反向退出当前帧。您将在上一帧中停止调用导致segfault的函数。

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

$ 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)
$gdb-q segvtest
从segvtest读取符号…完成。
(gdb)名单199999
1#包括
2.
3 INTA()
4       {
5 int*p=0;
6返回*p;
7       }
8.
9 int main()
10      {
11 int i=a();
12 printf(“a()返回%d\n”,i);
13      }
(gdb)手柄SIGSEGV停止nopass
信号停止打印传递至程序说明
SIGSEGV是是否分段故障
(gdb)运行
启动程序:/home/mp/segvtest
程序接收信号SIGSEGV,分段故障。
segvtest.c:6处a()中的0x00000000080006c0
6返回*p;
(gdb)返回12345
现在回来吗?(y或n)y
#segvtest.c:11处的main()中0 0x00000000080006d6
11 int i=a();
(gdb)c
持续的。
a()返回12345
[次1(流程74)正常退出]
(gdb)