C ++程序在FreeBSD 6.2上崩溃,操作系统足以创建核心转储。是否有可能截断一些堆栈帧,重置指令指针并重新启动gdb中的进程,以及如何?
答案 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()。 (请仔细阅读完整的源代码示例。