「分類:FreeBSD相關文件」修訂間的差異

出自啟示錄
跳至導覽 跳至搜尋
行 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 時的狀態。
 

於 2006年9月4日 (一) 02:17 的修訂