啟動:

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

運行:

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

查看代碼:

(gdb)list  簡寫為 (gdb)l

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


使用斷點:

建立斷點

(gdb)break  //可以簡寫為(gdb)b

(gdb)b <function>   || <file>:<function>  //這種是為還沒有打開的源代碼設置斷點

(gdb)b <line>    || <file>:<line>   || <address>   //在一個物理地址設置斷點

查看斷點

(gdb)info b

 

刪除斷點

(gdb)delete <breakpoint number>

(gdb)clear <line> || <file>:<line>

條件斷點

(gdb)break <operator(通常是函數名)> if <op> = <value>  //用于在滿足某個條件時中斷執行,在該operator處暫停

 

運行過程:

單步跟蹤:

(gdb)step //縮寫s

往下執行:

(gdb)next //縮寫n

檢查數據:

(gdb)display <varible>     //例如(gdb)display stack->index

(gdb)print <varible>    //縮寫p <varible>

改變數據:

(gdb)set <varible>=<value>      //例如set stack->index=100

檢查堆棧:

(gdb)backtrace   //縮寫bt, 將會打印當前調用的堆棧,從深到淺

停止程序:

(gdb)quit       //縮寫q

 

多進程調試:

跟蹤子進程:

(gdb)set follow-fork-mode child

跟蹤父進程:

(gdb)set follow-fork-mode parent

設置gdb在fork時詢問跟蹤哪一個進程:

(gdb)set follow-fork-mode ask

 

多線程調試:

如果某一行代碼被多個線程使用,可以這樣設置斷點:

(gdb)b pos.c:17 thread 5  //在地pos.c的17行設置斷點,但只對第5個線程生效。

(gdb)info threads  //查看當前應用程序中所有的線程

(gdb)b pos.c:17 thread 5 if ret > 0  //在pos.c的17行設置斷點,當內部棧變量ret > 0 時中斷

去指定線程:

(gdb)thread <thread number>

鎖定調度器來避開gdb根據優先權來改變當前線程:

(gdb)set scheduler-locking on/off

確定當前模式

(gdb)show scheduler -locking

想所有線程應用一個命令:

(gdb)thread apply all <command(比如backtrace)>

(gdb)thread apply 1 4 9 backtrace

 

調試已有的進程:

$gdb

掛接指定進程 :(gdb)attach <進程號>

脫離指定進程 :(gdb)dettach

 

調試內核轉儲文件:

$test

產生一個core文件,需要設置系統環境,見我的博客文章 www.shnenglu.com/TianShiDeBaiGu/articles/125785.html

$gdb test core.12345

 

??????????????????????????,沒有嘗試過的

(gdb)wacth 監控一個變量改變

(gdb)tbreak臨時斷點

 

斷點禁用啟用