GDB基本用法

2021-06-19 05:08:22 字數 4242 閱讀 2020

相關**

gdb的使用

當程式出錯並產生core 時

快速定位出錯函式的辦法

gdb 程式名 core檔名(一般是core,也可能是core.***x)

除錯程式使用的鍵

r run 執行.程式還沒有執行前使用

c cuntinue 繼續執行。執行中斷後繼續執行

q 退出

kill 終止除錯的程式

h help 幫助

命令補全功能

step 跟入函式

next 不跟入函式

b breakpoint 設定斷點。

用法:b 函式名 對此函式進行中斷

b 檔名:行號 對此檔案中指定行中斷.如果是當前檔案,那麼檔名與:號可以

省略看當前斷點數使用info break.禁止斷點disable 斷點號.刪除delete 斷點號.

l list 列出**行。一次列10 行。連線使用list將會滾動顯示. 也可以在list 後面

跟上 檔名:行號

watch 觀察乙個變數的值。每次中斷時都會顯示這個變數的值

p print 列印乙個變數的值。與watch不同的是print只顯示一次

這裡在順便說說如何改變乙個 value. 當你下指令 p 的時候,例如你用 p b,

這時候你會看到 b 的 value, 也就是上面的 $1 = 15.

你也同樣可以用 p 來改變乙個 value, 例如下指令 p b = 100 試試看,

這時候你會發現, b 的 value 就變成 100 了:$1 = 100.

網上抄錄

基本的使用方法簡介

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

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

1. 進入除錯程式並指定可執行檔案。

2. 指定程式**所在目錄。

3. 設定斷點後執行程式。

4. 程式於斷點中斷後,可以 (1)檢視程式執行狀態;檢視變數值或變更變數值 (2) 逐步執行程式,或是全速執行程式到下乙個斷點或是到程式結束為止。

5. 離開除錯程式。

以下將分為下列數項分別介紹:

1. 進入 gdb 及指定可執行檔

2. 指定程式**所在目錄及檢視程式**

3. 斷點的設定與清除

4. 全速及逐步執行程式

5. 檢視及更改變數值

6. 檢視程式執行狀態

7. 讀取 core 檔案資訊

進入 gdb 及指定可執行檔:

1. 進入 gdb 並讀入可執行檔 (檔名為 'program'),準備進行除錯。

gdb program

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

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

(gdb) directory dir

2. 檢視程式**,格式計有:

(gdb) list => 顯示目前執行程式**前後各五行的程式**;或是顯示從上次 list 之後的程式**

(gdb) list function => 顯示該程式開始處前後五行的程式**。

(gdb) list - =>上次顯示程式**的前面的十行。

斷點的設定與清除

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 語言的語法寫成。

2. 顯示各個斷點的資訊。

(gdb) info break

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

(gdb) clear filename.c:30

4. 清除斷點,num 是在 info break 顯示出來的斷點編號。

(gdb) delete num

全速及逐步執行程式

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

(gdb) run

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

(gdb) continue

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

(gdb) next

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

(gdb) step

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

(gdb) until

6. 執行現行程式到回到上一層程式為止。

(gdb) finish

檢視及更改變數值

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

(gdb) print a => 顯示 a 變數的內容.

(gdb) print sizeof(a) => 顯示 a 變數的長度.

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

(gdb) display a

3. 更改變數值:

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

檢視程式執行狀態

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

(gdb) backtrace

讀取 core 檔案資訊

1. 讀入 program 及 program.core 檔,可檢視 core dump 時程式變數值及程式流程狀態 。

gdb program core

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

補充一點兒

(最近我剛在用gdb,感覺還不錯,不過有的時候還是眼睛加printf更好

使)我更多是用gdb直接除錯程式,而不是core

gdb 可執行檔名 (進入gdb環境)

set ags -? (設定引數,即向你要除錯的程式傳參)

另外,用break functionname 和break linenum都可以設定斷點

用info break 可以檢視當前斷點的資訊

用clear清除斷點的時候要和break相對應

如果是用functionname設定的斷點就只能 clear functionname

用linenum設定的斷點就只能用clear linenum

以上是我近幾天學習gdb的一點經驗,都是我犯過錯誤的地方

希望對與我等同類的gdb菜鳥們有所幫助。

如果是剛開始時也可以使用ddd

圖形化的

另外對於斷點可以使用

delete 斷點號

刪除斷點號可以使用info break 得到

我也說說我的體會:

r (程式執行的引數) 可以設定執行時的引數

shell 執行shell環境的東西,比如shell make,完了以後直接r重新啟動程式,就可以帶上次已經加過的引數執行,不用再敲引數了

b 檔名:行號 有的時候很有用,嘿嘿

info b 看斷點資訊

disable 斷點號 暫停某個斷點

enable 斷點號 啟動某個斷點

delete (斷點號) 刪除某個斷點,不帶斷點號,全部刪除

x/32uxb 指標 以16進製制顯示該指標指向的32個位元組的資料

GDB 基本用法

在原來的的選項上再加上 g 選項,如 gcc g wall o2 o test test.c 或者 gcc g o test test.c。有一點需要注意的是除錯時最好去掉優化選項,比如內聯 inline 函式 優化 去掉函式呼叫,而將函式 在呼叫的位置展開 該函式名上就無法設定斷點。這是因為內聯函...

gdb 基本用法小結

1.當程式出錯並產生core 時快速定位出錯函式的辦法 gdb 程式名 core檔名 一般是core,也可能是core.x 2.除錯程式使用的鍵 rrun 執行.程式還沒有執行前使用 c cuntinue 執行到下一斷點處 qquit 退出tab tab命令補全功能 h help幫助s step 跟...

GDB的基本用法

本文參考 debug hacks 一書所作 每天進步一點點。一.準備 通過 gcc 的 g 選項生成除錯資訊。gcc wall o2 g 原始檔 g選項可以使用僅可gdb使用的一些附加除錯資訊 這些附加資訊可以使gdb工作的更好,但是也可能令其他偵錯程式崩潰或者不能讀該檔案。二.gdb基本用法 啟動...