天天看點

gdb調試工具簡介【二】

轉載自:http://blog.csdn.net/xjtuse_mal/article/details/1430369

gdb 的常用指令  

指令 解釋  

  break NUM 在指定的行上設定斷點。  

  bt 顯示所有的調用棧幀。該指令可用來顯示函數的調用順序。  

  clear 删除設定在特定源檔案、特定行上的斷點。其用法為clear FILENAME:NUM  

  continue 繼續執行正在調試的程式。該指令用在程式由于處理信号或斷點而 導緻停止運作時。  

  display EXPR 每次程式停止後顯示表達式的值。表達式由程式定義的變量組成。  

  file FILE 裝載指定的可執行檔案進行調試。  

  help NAME 顯示指定指令的幫助資訊。  

  info break 顯示目前斷點清單,包括到達斷點處的次數等。  

  info files 顯示被調試檔案的詳細資訊。  

  info func 顯示所有的函數名稱。  

  info local 顯示當函數中的局部變量資訊。  

  info prog 顯示被調試程式的執行狀态。  

  info var 顯示所有的全局和靜态變量名稱。  

  kill 終止正被調試的程式。  

  list 顯示源代碼段。  

  make 在不退出 gdb 的情況下運作 make 工具。  

  next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。  

  print EXPR 顯示表達式 EXPR 的值。 

******gdb 使用範例************************  

-----------------  

清單 一個有錯誤的 C 源程式 bugging.c  

代碼: 

-----------------  

1 #include   

2  

3 static char buff [256];  

4 static char* string;  

5 int main ()  

6 {  

7   printf ("Please input a string: ");  

8   gets (string);    

9   printf ("/nYour string is: %s/n", string);  

10 }  

-----------------  

  上面這個程式非常簡單,其目的是接受使用者的輸入,然後将使用者的輸入列印出來。該程式使用了一個未經過初始化的字元串位址  string,是以,編譯并運作之後,将出現 Segment Fault 錯誤:  

$ gcc -o bugging -g bugging.c  

$ ./bugging  

Please input a string: asfd  

Segmentation fault (core dumped)  

為了查找該程式中出現的問題,我們利用 gdb,并按如下的步驟進行:  

1.運作 gdb bugging 指令,裝入 bugging 可執行檔案;  

2.執行裝入的 bugging 指令 run;  

3.使用 where 指令檢視程式出錯的地方;  

4.利用 list 指令檢視調用 gets 函數附近的代碼;  

5.唯一能夠導緻 gets 函數出錯的因素就是變量 string。用print指令檢視 string 的值;  

6.在 gdb 中,我們可以直接修改變量的值,隻要将 string 取一個合法的指針值就可以了,為此,我們在第8行處設定斷點 break 8;  

7.程式重新運作到第 8行處停止,這時,我們可以用 set variable 指令修改 string 的取值;  

8.然後繼續運作,将看到正确的程式運作結果。

十.信号 

gdb通常可以捕捉到發送給它的大多數信号,通過捕捉信号,它就可決定對于正在運作的程序要做些什麼工作。例如,按CTRL-C将中斷信号發送給gdb,通常就會終止gdb。但是你或許不想中斷gdb,真正的目的是要中斷gdb正在運作的程式,是以,gdb要抓住該信号并停止它正在運作的程式,這樣就可以執行某些調試操作。

Handle指令可控制信号的處理,他有兩個參數,一個是信号名,另一個是接受到信号時該作什麼。幾種可能的參數是: 

l nostop 接收到信号時,不要将它發送給程式,也不要停止程式。 

l stop 接受到信号時停止程式的執行,進而允許程式調試;顯示一條表示已接受到信号的消息(禁止使用消息除外) 

l print 接受到信号時顯示一條消息 

l noprint 接受到信号時不要顯示消息(而且隐含着不停止程式運作) 

l pass 将信号發送給程式,進而允許你的程式去處理它、停止運作或采取别的動作。 

l nopass 停止程式運作,但不要将信号發送給程式。 

例如,假定你截獲SIGPIPE信号,以防止正在調試的程式接受到該信号,而且隻要該信号一到達,就要求該程式停止,并通知你。要完成這一任務,可利用如下指令: 

(gdb) handle SIGPIPE stop print 

請注意,UNIX的信号名總是采用大寫字母!你可以用信号編号替代信号名 

如果你的程式要執行任何信号處理操作,就需要能夠測試其信号處理程式,為此,就需要一種能将信号發送給程式的簡便方法,這就是signal指令的任務。該 指令的參數是一個數字或者一個名字,如SIGINT。假定你的程式已将一個專用的SIGINT(鍵盤輸入,或CTRL-C;信号2)信号處理程式設定成采 取某個清理動作,要想測試該信号處理程式,你可以設定一個斷點并使用如下指令: 

(gdb) signal 2 

continuing with signal SIGINT(2) 

該程式繼續執行,但是立即傳輸該信号,而且處理程式開始運作.

十一. 原檔案的搜尋 

search text:該指令可顯示在目前檔案中包含text串的下一行。 

Reverse-search text:該指令可以顯示包含text 的前一行。

十二.UNIX接口 

shell 指令可啟動UNIX外殼,CTRL-D退出外殼,傳回到 gdb.

十三.指令的曆史 

為了允許使用曆史指令,可使用 set history expansion on 指令 

(gdb) set history expansion on

小結:常用的gdb指令 

backtrace 顯示程式中的目前位置和表示如何到達目前位置的棧跟蹤(同義詞:where) 

breakpoint 在程式中設定一個斷點 

cd 改變目前工作目錄 

clear 删除剛才停止處的斷點 

commands 命中斷點時,列出将要執行的指令 

continue 從斷點開始繼續執行 

delete 删除一個斷點或監測點;也可與其他指令一起使用 

display 程式停止時顯示變量和表達時 

down 下移棧幀,使得另一個函數成為目前函數 

frame 選擇下一條continue指令的幀 

info 顯示與該程式有關的各種資訊 

jump 在源程式中的另一點開始運作 

kill 異常終止在gdb 控制下運作的程式 

list 列出相應于正在執行的程式的原檔案内容 

next 執行下一個源程式行,進而執行其整體中的一個函數 

print 顯示變量或表達式的值 

pwd 顯示目前工作目錄 

pype 顯示一個資料結構(如一個結構或C++類)的内容 

quit 退出gdb 

reverse-search 在源檔案中反向搜尋正規表達式 

run 執行該程式 

search 在源檔案中搜尋正規表達式 

set variable 給變量指派 

signal 将一個信号發送到正在運作的程序 

step 執行下一個源程式行,必要時進入下一個函數 

undisplay display指令的反指令,不要顯示表達式 

until 結束目前循環 

up 上移棧幀,使另一函數成為目前函數 

watch 在程式中設定一個監測點(即資料斷點) 

whatis 顯示變量或函數類型

****************************************************

 GNU的調試器稱為gdb,該程式是一個互動式工具,工作在字元模式。在 X Window 系統中,有一個gdb的前端圖形工具,稱為xxgdb。gdb 是功能強大的調試程式,可完成如下的調試任務:  

  * 設定斷點;  

  * 監視程式變量的值;  

  * 程式的單步執行;  

  * 修改變量的值。  

  在可以使用 gdb 調試程式之前,必須使用 -g 選項編譯源檔案。可在 makefile 中如下定義 CFLAGS 變量:  

   CFLAGS = -g  

   運作 gdb 調試程式時通常使用如下的指令:  

   gdb progname 

  在 gdb 提示符處鍵入help,将列出指令的分類,主要的分類有:  

  * aliases:指令别名  

  * breakpoints:斷點定義;  

  * data:資料檢視;  

  * files:指定并檢視檔案;  

  * internals:維護指令;  

  * running:程式執行;  

  * stack:調用棧檢視;  

  * statu:狀态檢視;  

  * tracepoints:跟蹤程式執行。  

  鍵入 help 後跟指令的分類名,可獲得該類指令的詳細清單。 

gdb 的常用指令  

指令 解釋  

  break NUM 在指定的行上設定斷點。  

  bt 顯示所有的調用棧幀。該指令可用來顯示函數的調用順序。  

  clear 删除設定在特定源檔案、特定行上的斷點。其用法為clear FILENAME:NUM  

  continue 繼續執行正在調試的程式。該指令用在程式由于處理信号或斷點而 導緻停止運作時。  

  display EXPR 每次程式停止後顯示表達式的值。表達式由程式定義的變量組成。  

  file FILE 裝載指定的可執行檔案進行調試。  

  help NAME 顯示指定指令的幫助資訊。  

  info break 顯示目前斷點清單,包括到達斷點處的次數等。  

  info files 顯示被調試檔案的詳細資訊。  

  info func 顯示所有的函數名稱。  

  info local 顯示當函數中的局部變量資訊。  

  info prog 顯示被調試程式的執行狀态。  

  info var 顯示所有的全局和靜态變量名稱。  

  kill 終止正被調試的程式。  

  list 顯示源代碼段。  

  make 在不退出 gdb 的情況下運作 make 工具。  

  next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。  

  print EXPR 顯示表達式 EXPR 的值。 

******gdb 使用範例************************  

-----------------  

清單 一個有錯誤的 C 源程式 bugging.c  

代碼: 

-----------------  

1 #include   

2  

3 static char buff [256];  

4 static char* string;  

5 int main ()  

6 {  

7   printf ("Please input a string: ");  

8   gets (string);    

9   printf ("/nYour string is: %s/n", string);  

10 }  

-----------------  

  上面這個程式非常簡單,其目的是接受使用者的輸入,然後将使用者的輸入列印出來。該程式使用了一個未經過初始化的字元串位址  string,是以,編譯并運作之後,将出現 Segment Fault 錯誤:  

$ gcc -o bugging -g bugging.c  

$ ./bugging  

Please input a string: asfd  

Segmentation fault (core dumped)  

為了查找該程式中出現的問題,我們利用 gdb,并按如下的步驟進行:  

1.運作 gdb bugging 指令,裝入 bugging 可執行檔案;  

2.執行裝入的 bugging 指令 run;  

3.使用 where 指令檢視程式出錯的地方;  

4.利用 list 指令檢視調用 gets 函數附近的代碼;  

5.唯一能夠導緻 gets 函數出錯的因素就是變量 string。用print指令檢視 string 的值;  

6.在 gdb 中,我們可以直接修改變量的值,隻要将 string 取一個合法的指針值就可以了,為此,我們在第8行處設定斷點 break 8;  

7.程式重新運作到第 8行處停止,這時,我們可以用 set variable 指令修改 string 的取值;  

8.然後繼續運作,将看到正确的程式運作結果。

繼續閱讀