使用 GDB 调试核心转储时的“最佳实践”是什么?
目前,我面临一个问题:
- 我的应用程序的发行版是在没有“-g”编译器标志的情况下编译的。
- 我的应用程序的调试版本(使用“-g”编译)已存档(以及源代码和发布二进制文件的副本)。
最近,当用户给我一个核心转储时,我尝试使用它进行调试
gdb --core=./core.pid ./my_app_debug-bin
核心是由my_app_release-bin
。核心文件和二进制文件之间似乎存在某种不匹配。
另一方面,如果我尝试
gdb --core=./core.pid ./my_app_release-bin
核心匹配,但我无法获取源代码行号(尽管我获取了函数名称)。
这就是实践的吗?因为我觉得我在这里失去了一些东西。
听起来您的发布版本和调试版本之间还存在其他差异,只是缺少/存在-g
旗帜。假设是这种情况,您现在无能为力,但您可以调整构建以更好地处理此问题:
这就是我们在我的工作地点所做的事情。
- 包括
-g
构建发行版本时进行标记。
- 存档该版本。
- run
strip --strip-unneeded
在将二进制文件发送给客户之前。
现在,当我们发生崩溃时,我们可以使用带有符号的存档版本来进行调试。
需要注意的一件事是,如果您的发行版本包含优化,即使使用符号调试也可能很困难。例如,优化器可以重新排序您的代码,因此即使调试器会说您在第 N 行崩溃,您也不能假设代码实际上执行了第 N-1 行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)