debuginfo

当使用gdb调试信息时,需要机器码与源码之间建立起映射关系,需要以下三个信息:

机器码:可执行文件,动态链接库,例如:libc-2.18.so

源代码:即.c和.h等源文件

映射关系:保存在.debug文件中的调试信息(debuginfo)

 

为了能够使用gdb跟踪调试程序,需要在编译阶段使用gcc时加上-g选项,这个选项的作用就是把debuginfo加到生成的可执行文件中。

对于大型的软件程序,如Linux内核,如果把这些debuginfo都加到程序中,就会带来一个显著的问题:可执行文件或库的所占用的空间会变的很大,这对于那些不关心调试信息的用户来说是不必要的。

因此它这些大型程序都会有一个debuginfo包,如:glibc-debuginfo-xxx-xxx.rpm,专门用于存放debuginfo调试信息。以后在需要定位问题的时候再将debuginfo包进行安装并添加到可执行文件或库中去。

对于debuginfo的提取和添加,可以借助objcopy工具进行操:

objcopy –only-keep-debug test test.debug   # 从test程序中提取调试信息,前提是gcc 加了 –g 选项

objcopy –strip-debug test                              # 从test程序中去除调试信息,此时gdb test,报错:no debugging symbols found

objcopy –add-gnu-debuglink=test.debug    # 将.debug放到与test同一路径下,向test中添加调试信息,此时再gdb test,则不会再报错

 

gdb查找.debug文件的顺序如下:

  1. 全局debug目录:/usr/lib/debug/.build-id/
  2. 当前目录:./
  3. 当前目录下的.debug目录:./debug/
原文地址:https://www.cnblogs.com/tongyishu/p/13214863.html