再學C/C++ 之 淺析gdb的-g選項

scutwang發表於2014-08-08

淺析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中的所有除錯資訊,以及原始碼中定義的巨集

 

相關文章