用GDB放开已知的堆栈和指令指针



我在linux x64上有一个核心转储。在某个时候,Sigsegv发生了,不幸的是,应用程序处理了此信号(但最后仍然失败(。因此,核心转储不直接包含原始Sigsegv的帧。

我能够确定失败指令的SP和IP(以及其他寄存器(。基本上,我有完整的Ucontext结构。

GDB/LLDB有没有办法,而不是在线程上显示堆栈,只是从已知的SP/IP中解开回溯?

我遇到了我上周同样的问题。我发生了一次崩溃,我没有主要的可执行文件或支持库,因此GDB无法显示我需要调试的库的回溯。我最终通过使用Magic_elf修改核心文件来修复它,以便将该线程中的RSP和RIP设置为Segfault处理程序报告的寄存器。

我写了一个关于如何完成的小教程:

http://www.mikekohn.net/software/core_file_analysis.php

GDB/LLDB有没有办法,而不是在线程上显示堆栈,只是从已知的SP/IP放松倒退?

RSPRIP是必要的,但是不够:您还需要在崩溃点知道堆栈的 contents

从您的描述中听起来,您的信号处理程序试图从此崩溃中恢复(也许是通过siglongjmp out(,在这种情况下,堆栈已解开,其内容可能已经消失。

事实并非如此,您也许可以手动放松堆栈,但是(据我所知(GDB对此没有任何支持。您必须检查Univind描述符(readelf -wf a.out(并手工执行必要的寄存器还原操作。

如果您的二进制文件是用帧指针构建的(这不是优化构建中x86_64的默认值(,这要容易得多:您只需要还原RBP,然后遵循帧指针链。

相关内容