首先看一个例子
case1
main.c
#include <stdio.h>
int main()
{
int a=1;
int b=2;
int c=0;
c=a+b;
printf("c=%d\n",c);
return 0;
}
gcc main.c -o main
生成可执行文件./main
然后gdb一下,如下:
因为,gcc默认是-O2选项,不含调试信息的,所以可以看到no debugging symbols found,没有可调试的符号表加载进来。 文件(main.c)也找不到,各个变量(a,b,c)也打印不了,都被优化掉了。
case2
那么我们用gcc -g -O0 main.c -o main再试一下。
gcc编译时加了-g选项后,gdb就可以读到调试用的符号表了,并且文件(main.c)也可以找到,变量(a,b,c)也都可以打印出来。
case3
现在我们在上一步骤的基础上,把main.c文件删除,然后gdb一下。
gdb就可以读到调试用的符号表了,但是文件(main.c)找不到,即没办法在gdb里看到源代码了,但是变量(a,b,c)还是可以打印出来。
debuginfo包
看了前面的三个例子,我们现在来说说debuginfo包。
一般在linux上,编写一个软件后,都会用rpmbuild工具打包成rpm包,然后发给别人去部署。
rpm包里一般就是有一些可执行文件,静态库或者动态库,但是不包含源代码。
那么有时候为了调试方便,还会同时生成相应的rpm debuginfo包,这样就可以方便调试。只要客户安装了普通rpm包和相应版本的debuginfo包,就可以gdb调试了,如果上面说的case3,虽然看不到源代码,但是可以打印相应的变量。
如何生成相应的debuginfo呢?
在相应的*.spec末尾加上
%debug_package
即可。