我正在尝试调试由 C++ 二进制文件生成的没有调试符号的核心文件。为了进行有效的调试,我需要调试符号,因此我使用 -g 选项重新编译了相同的代码,以便在重新编译的二进制文件中生成调试符号。我现在可以使用第二个二进制文件(有调试符号,其他一切都相同)调试第一个二进制文件(没有调试符号)生成的相同核心文件吗?
非常感谢!
如果您使用例如编译了原始可执行文件
g++ -O2 ...
,您不能(正如您可能已经发现的那样)使用使用 g++ -g ...
构建的新可执行文件来调试 core
- GDB 需要符号匹配,但它们不会(由于优化级别不同) .
您可以做的是使用与原始版本相同的优化来构建新的可执行文件,但也带有调试符号:
g++ -O2 -g ...
。
构建新的可执行文件后,运行
nm old.a.out > old.nm
、nm new.a.out > new.nm
并比较输出。它们应该相同或非常接近。
如果是,您应该能够使用
core
调试由 old.a.out
生成的 new.a.out
。
将来,您应该始终使用调试符号构建可执行文件,然后保留完整副本,但发送不带调试信息的副本:
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