啟動:

$gdb <file>  || $gdb 然后(gdb)file <file>

運行:

(gdb)run <該程序本身的命令行參數(shù)>

查看代碼:

(gdb)list  簡寫為 (gdb)l

技巧(gdb)list 1,20   //查看120行的代碼


使用斷點:

建立斷點

(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臨時斷點

 

斷點禁用啟用