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 <unistd.h>
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 (" Your string is: %s ", 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.然後繼續運行,將看到正確的程式運行結果。