gdb是一個(gè)由GNU開源組織發(fā)布的、UNIX/LINUX操作系統(tǒng)下的、基于命令行的认罩、功能強(qiáng)大的程序調(diào)試工具稠歉。
啟動(dòng)gdb
- 使用gdb之前掰担,需要講程序編譯出帶Debug信息的格式。(帶上 -g 參數(shù))
**-g ** Produce debugging information in the operating system's native
format (stabs, COFF, XCOFF, or DWARF). GDB can work with this
debugging information.
對(duì)C/C++程序的調(diào)試怒炸,需要在編譯前就加上-g選項(xiàng):
$ g++ -g hello.cc -o hello
調(diào)試可執(zhí)行文件:(可帶參數(shù))
$ gdb <program> <args>
gdb命令
運(yùn)行
- run:簡(jiǎn)記為 r 带饱,其作用是運(yùn)行程序,當(dāng)遇到斷點(diǎn)后横媚,程序會(huì)在斷點(diǎn)處停止運(yùn)行纠炮,等待用戶輸入下一步的命令。
- continue (簡(jiǎn)寫c ):繼續(xù)執(zhí)行灯蝴,到下一個(gè)斷點(diǎn)處(或運(yùn)行結(jié)束)
- next(簡(jiǎn)寫 n):恢口,單步跟蹤程序,當(dāng)遇到函數(shù)調(diào)用時(shí)穷躁,也不進(jìn)入此函數(shù)體耕肩;此命令同 step 的主要區(qū)別是因妇,step 遇到用戶自定義的函數(shù),將步進(jìn)到函數(shù)中去運(yùn)行猿诸,而 next 則直接調(diào)用函數(shù)婚被,不會(huì)進(jìn)入到函數(shù)體內(nèi)。
- step (簡(jiǎn)寫s):?jiǎn)尾秸{(diào)試如果有函數(shù)調(diào)用梳虽,則進(jìn)入函數(shù)址芯;與命令n不同,n是不進(jìn)入調(diào)用的函數(shù)的
- until:當(dāng)你厭倦了在一個(gè)循環(huán)體內(nèi)單步跟蹤時(shí)窜觉,這個(gè)命令可以運(yùn)行程序直到退出循環(huán)體谷炸。
- until+行號(hào): 運(yùn)行至某行,不僅僅用來(lái)跳出循環(huán)
- finish: 運(yùn)行程序禀挫,直到當(dāng)前函數(shù)完成返回旬陡,并打印函數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)值等信息。
- call 函數(shù)(參數(shù)):調(diào)用程序中可見的函數(shù)语婴,并傳遞“參數(shù)”描孟,如:call main(55)
- quit:簡(jiǎn)記為 q ,退出gdb
設(shè)置斷點(diǎn)
- break n (簡(jiǎn)寫b n):在第n行處設(shè)置斷點(diǎn)(可以帶上代碼路徑和代碼名稱)
- b fn1 if a>b:條件斷點(diǎn)設(shè)置
- break func(break縮寫為b):在函數(shù)func()的入口處設(shè)置斷點(diǎn)砰左,如:break cb_button
- delete 斷點(diǎn)號(hào)n:刪除第n個(gè)斷點(diǎn)
- disable 斷點(diǎn)號(hào)n:暫停第n個(gè)斷點(diǎn)
- enable 斷點(diǎn)號(hào)n:開啟第n個(gè)斷點(diǎn)
- clear 行號(hào)n:清除第n行的斷點(diǎn)
- info b (info breakpoints) :顯示當(dāng)前程序的斷點(diǎn)設(shè)置情況
- delete breakpoints:清除所有斷點(diǎn)
查看源代碼
- list :簡(jiǎn)記為 l 匿醒,其作用就是列出程序的源代碼,默認(rèn)每次顯示10行菜职。
- list 行號(hào):將顯示當(dāng)前文件以“行號(hào)”為中心的前后10行代碼青抛,如:list 12
- list 函數(shù)名:將顯示“函數(shù)名”所在函數(shù)的源代碼,如:list main
- list :不帶參數(shù)酬核,將接著上一次 list 命令的蜜另,輸出下邊的內(nèi)容。
打印表達(dá)式
- print 表達(dá)式:簡(jiǎn)記為 p 嫡意,其中“表達(dá)式”可以是任何當(dāng)前正在被測(cè)試程序的有效表達(dá)式举瑰,比如當(dāng)前正在調(diào)試C語(yǔ)言的程序,那么“表達(dá)式”可以是任何C語(yǔ)言的有效表達(dá)式蔬螟,包括數(shù)字此迅,變量甚至是函數(shù)調(diào)用。
- print a:將顯示整數(shù) a 的值
- print ++a:將把 a 中的值加1,并顯示出來(lái)
- print name:將顯示字符串 name 的值
- print gdb_test(22):將以整數(shù)22作為參數(shù)調(diào)用 gdb_test() 函數(shù)
- print gdb_test(a):將以變量 a 作為參數(shù)調(diào)用 gdb_test() 函數(shù)
- display 表達(dá)式:在單步運(yùn)行時(shí)將非常有用旧巾,使用display命令設(shè)置一個(gè)表達(dá)式后耸序,它將在每次單步進(jìn)行指令后,緊接著輸出被設(shè)置的表達(dá)式及值鲁猩。如: display a
- watch 表達(dá)式:設(shè)置一個(gè)監(jiān)視點(diǎn)坎怪,一旦被監(jiān)視的“表達(dá)式”的值改變,gdb將強(qiáng)行終止正在被調(diào)試的程序廓握。如: watch a
- whatis :查詢變量或函數(shù)
- info function: 查詢函數(shù)
- 擴(kuò)展info locals: 顯示當(dāng)前堆棧頁(yè)的所有變量
查詢運(yùn)行信息
- where/bt :當(dāng)前運(yùn)行的堆棧列表搅窿;
- bt backtrace 顯示當(dāng)前調(diào)用堆棧
- up/down 改變堆棧顯示的深度
- set args 參數(shù):指定運(yùn)行時(shí)的參數(shù)
- show args:查看設(shè)置好的參數(shù)
- info program: 來(lái)查看程序的是否在運(yùn)行嘁酿,進(jìn)程號(hào),被暫停的原因男应。
分割窗口
- layout:用于分割窗口闹司,可以一邊查看代碼,一邊測(cè)試:
- layout src:顯示源代碼窗口
- layout asm:顯示反匯編窗口
- layout regs:顯示源代碼/反匯編和CPU寄存器窗口
- layout split:顯示源代碼和反匯編窗口
- Ctrl + L:刷新窗口
參考自:http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
- 我的個(gè)人主頁(yè):http://www.techping.cn/
- 我的個(gè)人站點(diǎn)博客:http://blog.techping.cn/
- 我的CSDN博客:http://blog.csdn.net/techping
- 我的簡(jiǎn)書:http://www.reibang.com/users/b2a36e431d5e/
- 我的GitHub:https://github.com/techping