使用核心转储从崩溃中恢复

时间:2011-10-19 15:37:34

标签: c++ gdb coredump

C ++程序在FreeBSD 6.2上崩溃,操作系统足以创建核心转储。是否有可能截断一些堆栈帧,重置指令指针并重新启动gdb中的进程,以及如何?

3 个答案:

答案 0 :(得分:3)

  

是否可以截断一些堆栈帧,重置指令指针并在gdb中重启进程?

我假设你的意思是:更改进程状态,并将其设置为再次开始执行(就好像它从未在第一时间崩溃一样)。

没有。首先,你如何建议GDB(如果它神奇地具有这种能力)将处理你的文件描述符(当你的进程死亡时内核自动关闭)?

答案 1 :(得分:2)

是的,gdb可以调试核心转储以及运行程序。假设a.out是程序可执行文件的名称,a.core是核心文件的名称,请调用gdb,如下所示:

gdb a.out a.core

然后你可以像平常那样进行调试,除非你不能以任何方式继续执行(即使你可以,程序也会再次崩溃)。您可以检查堆栈跟踪,寄存器,内存等。

答案 2 :(得分:0)

可能重复:Best practices for recovering from a segmentation fault

总结:有可能但不推荐。这样做的方法是从信号处理程序中使用setjmp()和longjmp()。 (请仔细阅读完整的源代码示例。