程式碼中的錯誤可分為數類,除了最容易排除的語法錯誤,編譯器會告訴你錯誤所在外,大部分的錯誤都可以歸類為執行時錯誤。GDB的功能便是尋找執行時錯誤。如果沒有除錯程式,我們只能在程式中加入輸出變數值的指令來瞭解程式執行的狀態。有了GDB除錯程式,我們可以設定在任何地方停止程式的執行,然後可以隨意檢視變數值及更動變數,並逐行執行程式。
一個除錯程式執行的流程通常是這樣的:
1. 進入除錯程式並指定可執行檔。
2. 指定程式碼所在目錄。
3. 設定斷點後執行程式。
4. 程式於斷點中斷後,可以(1)檢視程式執行狀態;檢視變數值或變更變數值;
(2) 逐步執行程式,或是全速執行程式到下一個斷點或是到程式結束為止。
5. 離開除錯程式。
1:進入 GDB 並讀入可執行檔 (檔名為 'PROGRAM'),準備進行除錯:
gdb PROGRAM
2:指定程式碼所在目錄及檢視程式碼
2.1:增加目錄 DIR 到搜尋程式碼的目錄列表 (如果你的程式碼和可執行檔放在同一個目錄下,就不須指定程式碼所在目錄。):
(gdb) directory DIR
2.2:檢視程式碼,格式計有:
(gdb) list => 顯示目前執行程式代碼前後各五行的程式碼;或是顯示從上次 list 之後的程式碼。
(gdb) list function => 顯示該程式開始處前後五行的程式碼。
(gdb) list - => 上次顯示程式碼的前面的十行。
3:斷點的設定與清除
3.1:設定斷點(指令為 break,可簡寫為 (b),格式計有:
(gdb) break filename.c:30 =>; 在 filename.c 的第三十行處停止執行。
(gdb) break function =>; 在進入 function 時中斷程式的執行。
(gdb) break filename.c:function =>; 在程式碼檔 filename.c 中的函數 function 處設定斷點。
(gdb) break =>; 在下一個將被執行的命令設定斷點。
(gdb) break ... if cond =>; 只有當 cond 成立的時候才中斷。cond 須以 C 語言的文法寫成。
3.2:顯示各個斷點的資訊。
(gdb) info break
3.3:清除斷點(命令為 clear),格式同 break 。例如 :
(gdb) clear filename.c:30
3.4:清除斷點,NUM 是在 info break 顯示出來的斷點編號。
(gdb) delete NUM
4:全速及逐步執行程式
4.1:從程式開頭全速執行程式,直到遇到斷點或是程式執行完畢為止。
(gdb) run
4.2:在程式被中斷後,全速執行程式到下一個斷點或是程式結束為止 (continue 指令可簡寫為c)。
(gdb) continue
4.3:執行一行程式. 若呼叫函數, 則將該包含該函數程式碼視為一行程式 (next 指令可簡寫為 n)。
(gdb) next
4.4:執行一行程式. 若呼叫函數, 則進入函數逐行執行 (step 指令可簡寫為 s)。
(gdb) step
4.5:執行一行程式,若此時程式是在 for/while/do loop 迴圈的最後一行,則一直執行到迴圈結束後的第一行程式後停止 (until 指令可簡寫為u)。
(gdb) until
4.6:執行現行程式到回到上一層程式為止。
(gdb) finish
5:檢視及更改變數值
5.1:print 敘述,顯示該敘述執行的結果 (print 指令可簡寫為 p)。如
(gdb) print a => 顯示 a 變數的內容.
(gdb) print sizeof(a) => 顯示 a 變數的長度.
5.2:display 敘述,在每個斷點或是每執行一步時顯示該敘述值。如
(gdb) display a
5.3:更改變數值:
(gdb) print (a=10) => 將變數 a 的值設定為 10.
6:檢視程式執行狀態
查看程式執行到此時,是經過哪些函數呼叫的程式 (backtrace 指令可簡寫為 bt),也就是查看函數呼叫堆棧。
(gdb) backtrace
7:讀取 Core 檔案資訊
讀入 PROGRAM 及 PROGRAM.CORE 檔,可檢視 Core Dump 時程式變數值及程式流程狀態 。
gdb PROGRAM core
說明:'core' 檔案是由 PROGRAM 檔執行後,遇到 Core Dump 時產生的 Core 檔案名稱。如果你還需要該 Core 檔,我們建議你將該檔案檔名更改為 PROGRAM.core。在輸入上述命令後,你可以用 GDB 提供的檢視變數值以及檢視程式執行狀態來讀取程式 Core Dump 時的狀態。