如何调试从执行发布文件生成的核心转储文件?

Posted

技术标签:

【中文标题】如何调试从执行发布文件生成的核心转储文件?【英文标题】:how to debug core dump file generated from execute release file? 【发布时间】:2022-01-16 16:45:44 【问题描述】:

我正试图弄清楚如何调试从我发布的软件版本(使用 gcc 编译的 c 代码)发送给我的核心文件。

我有一个调试版本(使用 -g 编译)的可执行文件,我可以调试它吗?

或者有没有办法在文件之间进行映射以帮助调试过程。

【问题讨论】:

如果发布版本和调试版本完全相同(除了调试版本的调试信息),那么您应该可以使用核心。 谢谢,但是如果发布和调试不一样,是否可以以某种方式调试它? 【参考方案1】:

我有一个调试版本(使用 -g 编译)的可执行文件,我可以调试它吗?

没有。调试版本将为所有符号提供不同的地址,而 GDB 需要将符号正确映射到代码。

如果您使用 GCC 编译了二进制文件,您可能能够使用 all 原始版本标志和 -g 重新构建它。生成的可执行文件可能足够接近,但不能保证。

注意:这目前不适用于 Clang。

最佳做法是使用 -O2(或您正在使用的任何优化)和 -gtogether 编译二进制文件,然后使用 strip -g a.out -o a.out.release 并发送 a.out.release 二进制文件,同时保留完整调试 a.out 以供将来调试。

这样你保证发布的可执行文件和你的完整调试副本之间的所有符号地址都是相同的。

附: ways to automate 为任何给定的已发布二进制文件找到正确的完整调试副本,从而更容易确保为任何给定的已发布二进制文件加载正确完整调试文件。

【讨论】:

以上是关于如何调试从执行发布文件生成的核心转储文件?的主要内容,如果未能解决你的问题,请参考以下文章

gdb 调试远程核心转储

有哪些方法可以调试核心转储?

当 jvm 在 IBM-JDK 中处于活动状态时如何生成核心转储文件

如何从核心转储文件中提取 AT_EXECFN

Core dump文件和ECFS

如何从启用优化(发布模式)构建的二进制文件中分析故障转储?