如何在构建目标之外生成 gcc 调试符号?
我知道我可以使用 -g 选项生成调试符号。 但是该符号嵌入在目标文件中。 gcc 可以在结果可执行文件/库之外生成调试符号吗? 就像windows VC++编译器的.pdb文件一样。
I know I can generate debug symbol using -g option. However the symbol is embeded in the target file. Could gcc generate debug symbol outside the result executable/library? Like .pdb file of windows VC++ compiler did.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
注意:使用高优化级别(-O3、-O4)编译的程序无法为优化变量、内联函数和展开循环生成许多调试符号,无论符号是嵌入(-g)还是提取(objcopy)到“.debug”文件。
替代方法是
第一个选项提供了一种在以后通过完整的调试和符号重建生产代码的方法。 能够在不进行优化的情况下重新构建原始生产代码对于调试有巨大的帮助。 (注意:这假设测试是使用程序的优化版本完成的)。
您的构建系统可以创建一个 .c 文件,其中加载了编译日期、提交和其他 VCS 详细信息。 这是一个“make + git”示例:
编译程序后,您可以使用以下命令找到代码的原始“提交”:
strings -a my_program | grep VCS
剩下的就是检查原始代码,重新编译而不优化,然后开始调试。
NOTE: Programs compiled with high-optimization levels (-O3, -O4) cannot generate many debugging symbols for optimized variables, in-lined functions and unrolled loops, regardless of the symbols being embedded (-g) or extracted (objcopy) into a '.debug' file.
Alternate approaches are
The first option provides a means to rebuild the production code with full debugging and symbols at a later date. Being able to re-build the original production code with no optimizations is a tremendous help for debugging. (NOTE: This assumes testing was done with the optimized version of the program).
Your build system can create a .c file loaded with the compile date, commit, and other VCS details. Here is a 'make + git' example:
After the program is compiled you can locate the original 'commit' for your code by using the command:
strings -a my_program | grep VCS
All that is left is to check-out the original code, re-compile without optimizations, and start debugging.
到目前为止没有答案提到 eu-strip --strip-debug -f<输入>。
elftils
包提供的。文件中的调试符号已被删除,这些调试符号现在全部位于
中。No answer so far mentions
eu-strip --strip-debug -f <out.debug> <input>
.elfutils
package.<input>
file has been stripped of debug symbols which are now all in<out.debug>
.查看 strip 命令的“--only-keep-debug”选项。
从链接:
Check out the "--only-keep-debug" option of the strip command.
From the link:
使用调试信息进行编译:
分离调试信息:
或
从原始文件中剥离调试信息:
或
通过 debuglink 模式进行调试:
您还可以分别使用 exec 文件和符号文件:
或
详细信息:
参考:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files
https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug -Files.html
Compile with debug information:
Separate the debug information:
or
Strip debug information from origin file:
or
debug by debuglink mode:
You can also use exec file and symbol file separatly:
or
For details:
Ref:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files
https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
您需要使用 objcopy 来分离调试information:
我使用下面的 bash 脚本将调试信息分离到 .debug 目录中带有 .debug 扩展名的文件中。 这样我就可以将库和可执行文件打包到一个 tar 文件中,并将 .debug 目录打包到另一个 tar 文件中。 如果我想稍后添加调试信息,我只需提取调试 tar 文件,瞧,我就有了符号调试信息。
这是 bash 脚本:
You need to use objcopy to separate the debug information:
I use the bash script below to separate the debug information into files with a .debug extension in a .debug directory. This way I can tar the libraries and executables in one tar file and the .debug directories in another. If I want to add the debug info later on I simply extract the debug tar file and voila I have symbolic debug information.
This is the bash script: