如何获取 gdb 调用堆栈跟踪?

Posted

技术标签:

【中文标题】如何获取 gdb 调用堆栈跟踪?【英文标题】:How to get the gdb call stack trace? 【发布时间】:2020-08-19 13:49:20 【问题描述】:

我有一个核心转储和一个存储调试信息的文件,我可以在不使用可执行文件的情况下使用 gdb 来获取具有函数和行名称的调用堆栈吗?

【问题讨论】:

什么是“存储调试信息的文件”? g++ source.cpp -g -o executable_file; objcopy --only-keep-debug executable_file debug_file; debug_file - 调试信息文件 【参考方案1】:

我可以在不使用可执行文件的情况下使用 gdb 来获取带有函数名和行名的调用堆栈吗?

至少在 Linux/x86_64 上,答案是否定的:objcopy --only-keep-debug 之后保存的信息是不够的;您还需要可执行文件。

发生这种情况(至少部分)是因为debug_file 没有.eh_frame 部分,这是在x86_64 上展开所必需的。

如果您自己调试核心转储,则没有理由创建 debug_file - 只需保留带有完整调试信息的原始可执行文件以进行调试(您仍然可以将较小的剥离文件发送到执行机器)。

【讨论】:

以上是关于如何获取 gdb 调用堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Detours 如何工作以及如何使用它来获取堆栈跟踪?

GDB 获取python程序堆栈

如何调试 Linux 内核模块 `init()` 中的问题?

从程序内部调用 gdb 以打印其堆栈跟踪的最佳方法?

如何在 Java 中获取当前堆栈跟踪?

如何在 Java 中获取当前堆栈跟踪?