啟動:
$gdb <file> || $gdb 然后(gdb)file <file>
運行:
(gdb)run <該程序本身的命令行參數(shù)>
查看代碼:
(gdb)list 簡寫為 (gdb)l
技巧(gdb)list 1,20 //查看1到20行的代碼
使用斷點:
建立斷點
(gdb)break //可以簡寫為(gdb)b
(gdb)b <function> || <file>:<function> //這種是為還沒有打開的源代碼設(shè)置斷點
(gdb)b <line> || <file>:<line> || <address> //在一個物理地址設(shè)置斷點
查看斷點
(gdb)info b
刪除斷點
(gdb)delete <breakpoint number>
(gdb)clear <line> || <file>:<line>
條件斷點
(gdb)break <operator(通常是函數(shù)名)> if <op> = <value> //用于在滿足某個條件時中斷執(zhí)行,在該operator處暫停
運行過程:
單步跟蹤:
(gdb)step //縮寫s
往下執(zhí)行:
(gdb)next //縮寫n
檢查數(shù)據(jù):
(gdb)display <varible> //例如(gdb)display stack->index
(gdb)print <varible> //縮寫p <varible>
改變數(shù)據(jù):
(gdb)set <varible>=<value> //例如set stack->index=100
檢查堆棧:
(gdb)backtrace //縮寫bt, 將會打印當(dāng)前調(diào)用的堆棧,從深到淺
停止程序:
(gdb)quit //縮寫q
多進(jìn)程調(diào)試:
跟蹤子進(jìn)程:
(gdb)set follow-fork-mode child
跟蹤父進(jìn)程:
(gdb)set follow-fork-mode parent
設(shè)置gdb在fork時詢問跟蹤哪一個進(jìn)程:
(gdb)set follow-fork-mode ask
多線程調(diào)試:
如果某一行代碼被多個線程使用,可以這樣設(shè)置斷點:
(gdb)b pos.c:17 thread 5 //在地pos.c的17行設(shè)置斷點,但只對第5個線程生效。
(gdb)info threads //查看當(dāng)前應(yīng)用程序中所有的線程
(gdb)b pos.c:17 thread 5 if ret > 0 //在pos.c的17行設(shè)置斷點,當(dāng)內(nèi)部棧變量ret > 0 時中斷
去指定線程:
(gdb)thread <thread number>
鎖定調(diào)度器來避開gdb根據(jù)優(yōu)先權(quán)來改變當(dāng)前線程:
(gdb)set scheduler-locking on/off
確定當(dāng)前模式
(gdb)show scheduler -locking
想所有線程應(yīng)用一個命令:
(gdb)thread apply all <command(比如backtrace)>
(gdb)thread apply 1 4 9 backtrace
調(diào)試已有的進(jìn)程:
$gdb
掛接指定進(jìn)程 :(gdb)attach <進(jìn)程號>
脫離指定進(jìn)程 :(gdb)dettach
調(diào)試內(nèi)核轉(zhuǎn)儲文件:
$test
產(chǎn)生一個core文件,需要設(shè)置系統(tǒng)環(huán)境,見我的博客文章 m.shnenglu.com/TianShiDeBaiGu/articles/125785.html
$gdb test core.12345
??????????????????????????,沒有嘗試過的
(gdb)wacth 監(jiān)控一個變量改變
(gdb)tbreak臨時斷點
斷點禁用啟用