天天看點

gdb調試指令筆記

指令 描述
backtrace(或bt) 檢視各級函數調用及參數
finish 連續運作到目前函數傳回為止,然後停下來等待指令
frame(或f) 幀編号 選擇棧幀
info(或i) locals 檢視目前棧幀局部變量的值
list(或l) 列出源代碼,接着上次的位置往下列,每次列10行
list 行号 列出從第幾行開始的源代碼
list 函數名 列出某個函數的源代碼
next(或n) 執行下一行語句
print(或p) 列印表達式的值,通過表達式可以修改變量的值或者調用函數
quit(或q) 退出gdb調試環境
set var 修改變量的值
start 開始執行程式,停在main函數第一行語句前面等待指令
step(或s) 執行下一行語句,如果有函數調用則進入到函數中
 指令  解釋  示例
file <檔案名>

加載被調試的可執行程式檔案。

因為一般都在被調試程式所在目錄下執行GDB,因而文本名不需要帶路徑。

(gdb) file gdb-sample
r

Run的簡寫,運作被調試的程式。

如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第一個可用斷點處。

(gdb) r
c Continue的簡寫,繼續執行被調試程式,直至下一個斷點或程式結束。 (gdb) c

b <行号>

b <函數名稱>

b *<函數名稱>

b *<代碼位址>

d [編号]

b: Breakpoint的簡寫,設定斷點。兩可以使用“行号”“函數名稱”“執行位址”等方式指定斷點位置。

其中在函數名稱前面加“*”符号表示将斷點設定在“由編譯器生成的prolog代碼處”。如果不了解彙編,可以不予理會此用法。

d: Delete breakpoint的簡寫,删除指定編号的某個斷點,或删除所有斷點。斷點編号從1開始遞增。

(gdb) b 8

(gdb) b main

(gdb) b *main

(gdb) b *0x804835c

(gdb) d

s, n

s: 執行一行源程式代碼,如果此行代碼中有函數調用,則進入該函數;

n: 執行一行源程式代碼,此行代碼中的函數調用也一并執行。

s 相當于其它調試器中的“Step Into (單步跟蹤進入)”;

n 相當于其它調試器中的“Step Over (單步跟蹤)”。

這兩個指令必須在有源代碼調試資訊的情況下才可以使用(GCC編譯時使用“-g”參數)。

(gdb) s

(gdb) n

si, ni si指令類似于s指令,ni指令類似于n指令。所不同的是,這兩個指令(si/ni)所針對的是彙編指令,而s/n針對的是源代碼。

(gdb) si

(gdb) ni

p <變量名稱> Print的簡寫,顯示指定變量(臨時變量或全局變量)的值。

(gdb) p i

(gdb) p nGlobalVar

display …

undisplay <編号>

display,設定程式中斷後欲顯示的資料及其格式。

例如,如果希望每次程式中斷後可以看到即将被執行的下一條彙編指令,可以使用指令

“display /i pc”<br>其中 pc 代表目前彙編指令,/i 表示以十六進行顯示。當需要關心彙編代碼時,此指令相當有用。

undispaly,取消先前的display設定,編号從1開始遞增。

(gdb) display /i $pc

(gdb) undisplay 1

i Info的簡寫,用于顯示各類資訊,詳情請查閱“help i”。 (gdb) i r
q Quit的簡寫,退出GDB調試環境。 (gdb) q
help [指令名稱]

GDB幫助指令,提供對GDB名種指令的解釋說明。

如果指定了“指令名稱”參數,則顯示該指令的詳細說明;如果沒有指定參數,則分類顯示所有GDB指令,供使用者進一步浏覽和查詢。

(gdb) help display