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