首先看一個例子
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
即可。