Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GDB展开已知堆栈和指令指针_Gdb_Coredump_Postmortem Debugging - Fatal编程技术网

使用GDB展开已知堆栈和指令指针

使用GDB展开已知堆栈和指令指针,gdb,coredump,postmortem-debugging,Gdb,Coredump,Postmortem Debugging,我在Linux x64上有一个内核转储。在某个时刻发生了SIGSEGV,不幸的是应用程序处理了这个信号(但最终还是失败了)。所以核心转储不直接包含原始SIGSEGV的帧 我能够确定失败指令的SP和IP(以及其他寄存器)。基本上我有完整的ucontext结构 GDB/LLDB有没有办法不显示线程上的堆栈,而只是从已知的SP/IP中展开回溯 GDB/LLDB有没有办法不显示线程上的堆栈,而只是从已知的SP/IP中展开回溯 RSP和RIP是必要的,但还不够:您还需要知道崩溃点堆栈的内容 从您的描述听起

我在Linux x64上有一个内核转储。在某个时刻发生了SIGSEGV,不幸的是应用程序处理了这个信号(但最终还是失败了)。所以核心转储不直接包含原始SIGSEGV的帧

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

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

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

RSP
RIP
是必要的,但还不够:您还需要知道崩溃点堆栈的内容

从您的描述听起来,您的信号处理程序试图从这次崩溃中恢复(可能是通过
siglongjmp
ing out),在这种情况下,堆栈已展开,其内容可能已丢失

事实并非如此,您可以手动展开堆栈,但(据我所知)GDB不支持这样做。您必须检查展开描述符(
readelf-wf a.out
),并手动执行必要的寄存器还原操作


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

我上周也遇到了同样的问题。我发生了一次崩溃,因为我没有主可执行文件或支持库,所以gdb无法显示我需要调试的库的回溯。最后,我使用magic_elf修改了核心文件,从而将该线程中的RSP和RIP设置为segfault处理程序报告的寄存器,从而解决了这个问题

我写了一篇关于如何做到这一点的小教程:


当然可以。讨论中的应用程序是.NET核心。我真的不明白为什么他们用信号处理程序做了那么多魔术,而在SIGSEGV上崩溃应该没问题。不管怎么说,我现在需要现场复制。