我正在尝试调试由C ++二进制文件生成的核心文件而没有调试符号。为了进行有效的调试,我需要调试符号,所以我用-g选项重新编译了相同的代码,以便在重新编译的二进制文件中生成调试符号。我现在可以使用第二个二进制文件调试第一个二进制文件生成的相同核心文件(没有调试符号)(有调试符号,其他一切都一样)吗?
非常感谢!
答案 0 :(得分:5)
如果您使用例如编译原始可执行文件g++ -O2 ...
,你不能(正如你可能已经发现的那样)使用一个用g++ -g ...
构建的新可执行文件来调试core
- GDB需要匹配的符号,而它们不会(到期)差异化优化水平)。
可以做的是使用与原始版本相同的优化来构建新的可执行文件,但还带有调试符号:g++ -O2 -g ...
。
在构建新的可执行文件后,运行nm old.a.out > old.nm
,nm new.a.out > new.nm
并比较输出。它们应该相同或非常接近。
如果是,您应该能够使用new.a.out调试old.a.out生成的core
。
将来,您应该始终使用调试符号构建可执行文件,然后保留完整副本,但是发送没有调试信息的副本:
cp a.out a.out.debug
strip --strip-debug a.out
# a.out is now good to send to customers
# keep a.out.debug for future debugging