2010-09-24 50 views
6

我试图调试由C++二进制生成的核心文件没有调试符号。为了进行有效的调试,我需要调试符号,所以我使用-g选项重新编译了相同的代码,以便在重新编译的二进制文件中生成调试符号。现在可以使用第二个二进制文件(具有调试符号,其他所有内容都是相同的)来调试由第一个二进制文件生成的相同核心文件(不带调试符号)吗?我可以调试由C++二进制生成的核心,而不使用调试符号使用与调试符号重新编译相同的二进制

非常感谢!

回答

5

如果您编译了原始的可执行文件, g++ -O2 ...,你不能(因为你可能已经发现)使用g++ -g ...构建的新的可执行文件来调试core - GDB需要匹配的符号,他们不会(由于优化级别的差异)。

什么你可以做的是建立新的可执行文件具有相同优化为原创,但也调试符号:g++ -O2 -g ...

在创建新的可执行文件之后,运行nm old.a.out > old.nmnm 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