我可以使用使用调试符号重新编译的相同二进制文件来调试由没有调试符号的 C++ 二进制文件生成的内核吗

问题描述 投票:0回答:1

我正在尝试调试由 C++ 二进制文件生成的没有调试符号的核心文件。为了进行有效的调试,我需要调试符号,因此我使用 -g 选项重新编译了相同的代码,以便在重新编译的二进制文件中生成调试符号。我现在可以使用第二个二进制文件(有调试符号,其他一切都相同)调试第一个二进制文件(没有调试符号)生成的相同核心文件吗?

非常感谢!

c++ gdb
1个回答
6
投票

如果您使用例如编译了原始可执行文件

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
© www.soinside.com 2019 - 2024. All rights reserved.