c++ - 调试符号稳定性
问题描述
我正在编译一个带有-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__
?
如果我启用代码优化,它会起作用吗?
解决方案
调试符号是否匹配...
如果我启用代码优化,它会起作用吗?
正如其他人所评论的那样,您不应该依赖这一点,而应始终-g
在交付“最终产品”之前构建并分离调试符号。
也就是说,在实践中这适用于 GCC 1,无论是否有优化,但对于 Clang/LLVM 根本不起作用(这给了你一个不依赖这个的实际理由)。
1或者至少几年前我上次尝试对几个重要的二进制文件进行此操作时确实如此。
请注意,维护此属性需要编译器开发人员的积极努力,因此可以在引入、注意和修复违规时破坏。
推荐阅读
- javascript - 有没有办法在反应的选择标签中有一个选定的禁用选项
- scala - Spark 读取为 jdbc 将所有行作为列名返回
- node.js - 如何订购 mongodb 集合
- java - 流收集方法
- c# - 如何有效地将信息从类传递回主程序?
- datagrip - 如何在datagrip中显示oracle数据库链接列表?
- sql - 两个日期列之间的工作日数
- laravel - 在 Laravel 中复制目录
- azure - 创建脚本以收集 Azure 中的 StorageAccount 选项
- javascript - 为什么 express-session(SameSite 属性)在 Chrome 上不起作用?