淺析gdb的-g選項
準備
gdb是Linux下學習C/C++最常用的debug工具。要使用這一強大工具,必須在編譯時加上-g選項,生成的目標檔案才可以用gdb進行除錯。
如,先建立一個test.c檔案,內容為:
1 #include <stdio.h> 2 3 int main(void){ 4 int a[2]; 5 a[0] = 1; 6 a[1] = 2; 7 return 0; 8 }
使用編譯語句,進行編譯:
gcc -g test.c -o test.out
淺析-g選項
-g選項的作用就是在編譯生成的目標檔案中加入原始碼資訊。例如,把目標檔案中的機器指令與原始碼的行數對應起來。注意,這裡並不是將整個原始碼都添嵌入到目標檔案中,而是隻是新增對應的行數資訊,因此,在進行debug的時候,必須保證gdb可以找到原始檔。
下面做一個小測試進行驗證:
(1)先針對上面的檔案除錯:
1 gdb test.out 2 (gdb) start
如下:
可以看到,第一個breakpoint是第5行,且原始碼為:
a[0] = 1;
這個時候,如果在原始檔中的第一和第三行間新增1行,然後再執行gdb(注意,不要在執行gcc編譯)
1 gdb test.out 2 (gdb) start
此時,發現gdb中第一個breakpoint仍為第5行,但是,原始碼卻為原來的上一行。
由此,驗證了我們的說法:“gdb只是新增對應的行數資訊,而非嵌入原始碼”。
擴充套件
-g 選項具有三個等級。即:
-g1
不包含區域性變數和與行號有關的除錯資訊,因此只能夠用於回溯跟蹤和堆疊儲存和函式的呼叫等等。
-g2
預設的級別,此時產生的除錯資訊包括擴充套件的符號表、行號、區域性或外部變數資訊
-g3
包含級別2中的所有除錯資訊,以及原始碼中定義的巨集