首页 > 解决方案 > 调试符号稳定性

问题描述

我正在编译一个带有-g选项的应用程序:

gcc -g -o main1 main.c

然后我从中剥离调试对象:

objcopy --strip-debug main1

假设我的main1应用程序将崩溃,我想使用核心转储coredump1来调试问题。

我可以再次重建源代码吗

gcc -g -o main2 main.c

并提取调试符号

objcopy --only-keep-debug main2 main2.debug

并用于main2.debug调试coredump1

我可以相信调试符号将始终对齐吗?它是由语言标准或编译器要求保证的吗?

如果我的源代码将包含基于宏之类的字符串,调试符号是否__DATE__匹配__TIME__

如果我启用代码优化,它会起作用吗?

标签: c++cdebuggingstandardscoredump

解决方案


调试符号是否匹配...
如果我启用代码优化,它会起作用吗?

正如其他人所评论的那样,您不应该依赖这一点,而应始终-g在交付“最终产品”之前构建并分离调试符号。

也就是说,在实践中这适用于 GCC 1,无论是否有优化,但对于 Clang/LLVM 根本不起作用(这给了你一个不依赖这个的实际理由)。


1或者至少几年前我上次尝试对几个重​​要的二进制文件进行此操作时确实如此。

请注意,维护此属性需要编译器开发人员的积极努力,因此可以在引入、注意和修复违规时破坏。


推荐阅读