你會(huì)使用GDB調(diào)試命令?
1、查看源碼:
list [函數(shù)名][行數(shù)]
2、暫停程序
(1)設(shè)置斷點(diǎn):
a、break + [源代碼行號(hào)][源代碼函數(shù)名][內(nèi)存地址]
b、break ... if condition ...可以是上述任一參數(shù),condition是條件。例如在循環(huán)體中可以設(shè)置break ... if i = 100 來設(shè)置循環(huán)次數(shù)
(2)觀察斷點(diǎn):
a、watch + [變量][表達(dá)式] 當(dāng)變量或表達(dá)式值改變時(shí)即停住程序。
b、rwatch + [變量][表達(dá)式] 當(dāng)變量或表達(dá)式被讀時(shí),停住程序。
c、awatch + [變量][表達(dá)式] 當(dāng)變量或表達(dá)式被讀或被寫時(shí),停住程序。
(3)設(shè)置捕捉點(diǎn):
catch + event 當(dāng)event發(fā)生時(shí),停住程序。
event可以是下面的內(nèi)容:
a、throw 一個(gè)C++拋出的異常。(throw為關(guān)鍵字)
b、catch 一個(gè)C++捕捉到的異常。(catch為關(guān)鍵字)
c、exec 調(diào)用系統(tǒng)調(diào)用exec時(shí)。(exec為關(guān)鍵字,目前此功能只在HP-UX下有用)
d、fork 調(diào)用系統(tǒng)調(diào)用fork時(shí)。(fork為關(guān)鍵字,目前此功能只在HP-UX下有用)
e、vfork 調(diào)用系統(tǒng)調(diào)用vfork時(shí)。(vfork為關(guān)鍵字,目前此功能只在HP-UX下有用)
f、load 或 load 載入共享庫(動(dòng)態(tài)鏈接庫)時(shí)。(load為關(guān)鍵字,目前此功能只在HP-UX下有用)
g、unload 或 unload 卸載共享庫(動(dòng)態(tài)鏈接庫)時(shí)。(unload為關(guān)鍵字,目前此功能只在HP-UX下有用)
(4)捕獲信號(hào):
handle + [argu] + signals
signals:
是Linux/Unix定義的信號(hào),SIGINT表示中斷字符信號(hào),也就是Ctrl+C的信號(hào),SIGBUS表示硬件故障的信號(hào);SIGCHLD表示子進(jìn)程狀態(tài)改變信號(hào); SIGKILL表示終止程序運(yùn)行的信號(hào),等等。
argu:
nostop 當(dāng)被調(diào)試的程序收到信號(hào)時(shí),GDB不會(huì)停住程序的運(yùn)行,但會(huì)打出消息告訴你收到這種信號(hào)。
stop 當(dāng)被調(diào)試的程序收到信號(hào)時(shí),GDB會(huì)停住你的程序。
print 當(dāng)被調(diào)試的程序收到信號(hào)時(shí),GDB會(huì)顯示出一條信息。
noprint 當(dāng)被調(diào)試的程序收到信號(hào)時(shí),GDB不會(huì)告訴你收到信號(hào)的信息。
pass or noignore 當(dāng)被調(diào)試的程序收到信號(hào)時(shí),GDB不處理信號(hào)。這表示,GDB會(huì)把這個(gè)信號(hào)交給被調(diào)試程序會(huì)處理。
nopass or ignore 當(dāng)被調(diào)試的程序收到信號(hào)時(shí),GDB不會(huì)讓被調(diào)試程序來處理這個(gè)信號(hào)。
(5)線程中斷:
break [linespec] thread [threadno] [if ...]
linespec 斷點(diǎn)設(shè)置所在的源代碼的行號(hào)。如: test.c:12表示文件為test.c中的第12行設(shè)置一個(gè)斷點(diǎn)。
threadno 線程的ID。是GDB分配的,通過輸入info threads來查看正在運(yùn)行中程序的線程信息。
if ... 設(shè)置中斷條件。
3、查看信息:
(1)查看數(shù)據(jù):
print variable 查看變量
print *array@len 查看數(shù)組(array是數(shù)組指針,len是需要數(shù)據(jù)長(zhǎng)度)
可以通過添加參數(shù)來設(shè)置輸出格式:
/x 按十六進(jìn)制格式顯示變量。
/d 按十進(jìn)制格式顯示變量。
/u 按十六進(jìn)制格式顯示無符號(hào)整型。
/o 按八進(jìn)制格式顯示變量。
/t 按二進(jìn)制格式顯示變量。
/a 按十六進(jìn)制格式顯示變量。
/c 按字符格式顯示變量。
/f 按浮點(diǎn)數(shù)格式顯示變量。
(2)查看內(nèi)存:
examine /n f u + 內(nèi)存地址(指針變量)
n 表示顯示內(nèi)存長(zhǎng)度
f 表示輸出格式(見上)
u 表示字節(jié)數(shù)制定(b 單字節(jié);h 雙字節(jié);w 四字節(jié);g 八字節(jié);默認(rèn)為四字節(jié))
如:
x /10cw pFilePath (pFilePath為一個(gè)字符串指針,指針占4字節(jié))
x 為examine命令的簡(jiǎn)寫。
(3)查看棧信息:
backtrace [-n][n]
n 表示只打印棧頂上n層的棧信息。
-n 表示只打印棧底上n層的棧信息。
不加參數(shù),表示打印所有棧信息。
基本gdb命令:
---------------------------------------------------------------------
命令 簡(jiǎn)寫 功能
---------------------------------------------------------------------
file 裝入想要調(diào)試的可執(zhí)行文件.
kill k 終止正在調(diào)試的程序.
list l 列出產(chǎn)生執(zhí)行文件的源代碼的一部分.
next n 執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部.
step s 執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部.
continue c 繼續(xù)執(zhí)行程序,直至下一中斷或者程序結(jié)束。
run r 執(zhí)行當(dāng)前被調(diào)試的程序.
quit q 終止 gdb.
watch 使你能監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變.
catch 設(shè)置捕捉點(diǎn).
thread t 查看當(dāng)前運(yùn)行程序的線程信息.
break b 在代碼里設(shè)置斷點(diǎn), 這將使程序執(zhí)行到這里時(shí)被掛起.
make 使你能不退出 gdb 就可以重新產(chǎn)生可執(zhí)行文件.
shell 使你能不離開 gdb 就執(zhí)行 UNIX shell 命令.
print p 打印數(shù)據(jù)內(nèi)容。
examine x 打印內(nèi)存內(nèi)容。
backtrace bt 查看函數(shù)調(diào)用棧的所有信息。





