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

我可以调试C++;不带调试符号的二进制文件,使用与调试符号重新编译的相同二进制文件 我尝试调试一个由C++二进制文件生成的核心文件,没有调试符号。为了进行有效的调试,我需要调试符号,因此我使用-g选项重新编译了相同的代码,以便在重新编译的二进制文件中生成调试符号。我现在可以使用第二个二进制文件(有调试符号,其他都一样)调试第一个二进制文件(没有调试符号)生成的同一个核心文件了吗,c++,gdb,C++,Gdb,非常感谢 如果您使用例如g++-O2…编译原始可执行文件,您不能(正如您可能已经发现的那样)使用用g++-g…构建的新可执行文件来调试核心——GDB需要匹配符号,而它们不会匹配(由于优化级别不同) 您可以使用与原始文件相同的优化来构建新的可执行文件,但也可以使用调试符号:g++-O2-g… 构建新的可执行文件后,运行nmold.a.out>old.nm,nmnew.a.out>new.nm,并比较输出。它们应该相同或非常接近 如果是,您应该能够使用new.a.out调试由old.a.out生成的

非常感谢

如果您使用例如
g++-O2…
编译原始可执行文件,您不能(正如您可能已经发现的那样)使用用
g++-g…
构建的新可执行文件来调试
核心
——GDB需要匹配符号,而它们不会匹配(由于优化级别不同)

您可以使用与原始文件相同的优化来构建新的可执行文件,但也可以使用调试符号:
g++-O2-g…

构建新的可执行文件后,运行
nmold.a.out>old.nm
nmnew.a.out>new.nm
,并比较输出。它们应该相同或非常接近

如果是,您应该能够使用new.a.out调试由old.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