当使用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文件的顺序如下:
- 全局debug目录:/usr/lib/debug/.build-id/
- 当前目录:./
- 当前目录下的.debug目录:./debug/