「分類: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:16 的修訂

來源: [GDB Basic Usage]


前言

程式碼中的錯誤可分為數類,除了最容易除錯的語法錯誤,編譯程式會告訴你錯誤所在外,大部分的錯誤都可以歸類為執行時錯誤。GDB 的功能便是尋找執行時錯誤。如果沒有除錯程式,我們只能在程式中加入輸出變數值的指令來了解程式執行的狀態。有了 GDB 除錯程式,我們可以設定在任何地方停止程式的執行,然後可以隨意檢視變數值及更動變數,並逐行執行程式。

程式除錯流程

一個除錯程式執行的流程通常是這樣的:

  1. 進入除錯程式並指定可執行檔。
  2. 指定程式碼所在目錄。
  3. 設定中斷點後執行程式。
  4. 程式於中斷點中斷後,可以
    1. 檢視程式執行狀態;檢視變數值或變更變數值。
    2. 逐步執行程式,或是全速執行程式到下一個中斷點或是到程式結束為止。
  5. 離開除錯程式。

進入 GDB 及指定可執行檔

進入 GDB 並讀入可執行檔 (檔名為 'PROGRAM'),準備進行除錯。

gdb PROGRAM

指定程式碼所在目錄及檢視程式碼

增加目錄 DIR 到收尋程式碼的目錄列表 (如果你的程式碼和可執行檔放在同一個目錄下,就不須指定程式碼所在目錄。):

(gdb) directory DIR

檢視程式碼,格式計有:

  • 顯示目前執行程式碼前後各五行的程式碼;或是顯示從上次 list 之後的程式碼
(gdb) list
  • 顯示該程序開始處前後五行的程式碼。
(gdb) list function
  • 上次顯示程式碼的前面的十行。
(gdb) list

中斷點的設定與清除

設定中斷點 (指令為 break,可簡寫為 b),格式計有:

  • 在 filename.c 的第三十行處停止執行。
(gdb) break filename.c:30
  • 在進入 function 時中斷程式的執行。
(gdb) break function
  • 在程式碼檔 filename.c 中的函數 function 處設定中斷點。
(gdb) break filename.c:function

在下一個將被執行的命令設定中斷點。

(gdb) break

只有當 cond 成立的時候才中斷。cond 須以 C 語言的語法寫成。

(gdb) break ... if cond

顯示各個中斷點的資訊。

(gdb) info break

清除中斷點(命令為 clear),格式同 break 。例如 :

(gdb) clear filename.c:30

清除中斷點,NUM 是在 info break 顯示出來的中斷點編號。

(gdb) delete NUM

全速及逐步執行程式

從程式開頭全速執行程式,直到遇到中斷點或是程式執行完畢為止。

(gdb) run

在程式被中斷後,全速執行程式到下一個中斷點或是程式結束為止 (continue 指令可簡寫為 c)。

(gdb) continue

執行一行程式. 若呼叫函數, 則將該包含該函數程式碼視為一行程式 (next 指令可簡寫為 n)。

(gdb) next

執行一行程式. 若呼叫函數, 則進入函數逐行執行 (step 指令可簡寫為 s)。

(gdb) step

執行一行程式,若此時程式是在 for/while/do loop 迴圈的最後一行,則一直執行到迴圈結束後的第一行程式後停止 (until 指令可簡寫為 u)。

(gdb) until

執行現行程序到回到上一層程序為止。

(gdb) finish

檢視及更改變數值

print 敘述,顯示該敘述執行的結果 (print 指令可簡寫為 p)。如

  • 顯示 a 變數的內容。
(gdb) print a
  • 顯示 a 變數的長度。
(gdb) print sizeof(a)

display 敘述,在每個中斷點或是每執行一步時顯示該敘述值。如

(gdb) display a

更改變數值:

  • 將變數 a 的值設定為 10
(gdb) print (a=10)

檢視程式執行狀態

查看程式執行到此時,是經過哪些函數呼叫的程序 (backtrace 指令可簡寫為 bt),也就是查看函數呼叫堆疊。

(gdb) backtrace

讀取 Core 檔資訊

讀入 PROGRAM 及 PROGRAM.CORE 檔,可檢視 Core Dump 時程式變數值及程式流程狀態 。

gdb PROGRAM core

說明:'core' 檔案是由 PROGRAM 檔執行後,遇到 Core Dump 時產生的 Core 檔檔名。如果你還需要該 Core 檔,我們建議你將該檔案檔名更改為PROGRAM.core。在輸入上述命令後,你可以用 GDB 提供的檢視變數值以及檢視程式執行狀態來讀取程式 Core Dump 時的狀態。