啟動:
$gdb <file> || $gdb 然后(gdb)file <file>
運行:
(gdb)run <該程序本身的命令行參數>
查看代碼:
(gdb)list 簡寫為 (gdb)l
技巧(gdb)list 1,20 //查看1到20行的代碼
使用斷點:
建立斷點
(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臨時斷點
斷點禁用啟用