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