調(diào)用gdb編譯需要在cc后面加 -g參數(shù)再加-o;
[root@redhat home]#gdb 調(diào)試文件:?jiǎn)?dòng)gdb
(gdb) l :(字母l)從第一行開始列出源碼
(gdb) break n :在第n行處設(shè)置斷點(diǎn)
(gdb) break func:在函數(shù)func()的入口處設(shè)置斷點(diǎn)
(gdb) info break: 查看斷點(diǎn)信息
(gdb) r:運(yùn)行程序
(gdb) n:?jiǎn)尾綀?zhí)行
(gdb) c:繼續(xù)運(yùn)行
(gdb) p 變量 :打印變量的值
(gdb) bt:查看函數(shù)堆棧
(gdb) finish:退出函數(shù)
(gdb) shell 命令行:執(zhí)行shell命令行
(gdb) set args 參數(shù):指定運(yùn)行時(shí)的參數(shù)
(gdb) show args:查看設(shè)置好的參數(shù)
(gdb) show paths:查看程序運(yùn)行路徑;
set environment varname [=value] 設(shè)置環(huán)境變量。如:set env USER=hchen;
show environment [varname] 查看環(huán)境變量;
(gdb) cd 相當(dāng)于shell的cd;
(gdb)pwd :顯示當(dāng)前所在目錄
(gdb)info program: 來查看程序的是否在運(yùn)行,進(jìn)程號(hào),被暫停的原因。
(gdb)clear 行號(hào)n:清除第n行的斷點(diǎn)
(gdb)delete 斷點(diǎn)號(hào)n:刪除第n個(gè)斷點(diǎn)
(gdb)disable 斷點(diǎn)號(hào)n:暫停第n個(gè)斷點(diǎn)
(gdb)enable 斷點(diǎn)號(hào)n:開啟第n個(gè)斷點(diǎn)
(gdb)step:?jiǎn)尾秸{(diào)試如果有函數(shù)調(diào)用,則進(jìn)入函數(shù);與命令n不同,n是不進(jìn)入調(diào)用的函數(shù)的
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)容。
注意 :如果運(yùn)行l(wèi)ist 命令得到類似如下的打印,那是因?yàn)樵诰幾g程序時(shí)沒有加入 -g 選項(xiàng):
(gdb) list
1 ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/start.S
run:簡(jiǎn)記為 r ,其作用是運(yùn)行程序,當(dāng)遇到斷點(diǎn)后,程序會(huì)在斷點(diǎn)處停止運(yùn)行,等待用戶輸入下一步的命令。
回車:重復(fù)上一條命令。
set args:設(shè)置運(yùn)行程序時(shí)的命令行參數(shù),如:set args 33 55
show args:顯示命令行參數(shù)
continue:簡(jiǎn)訊為 c ,其作用是繼續(xù)運(yùn)行被斷點(diǎn)中斷的程序。
break:為程序設(shè)置斷點(diǎn)。
break 行號(hào):在當(dāng)前文件的“行號(hào)”處設(shè)置斷點(diǎn),如:break 33
break 函數(shù)名:在用戶定義的函數(shù)“函數(shù)名”處設(shè)置斷點(diǎn),如:break cb_button
info breakpoints:顯示當(dāng)前程序的斷點(diǎn)設(shè)置情況
disable breakpoints Num:關(guān)閉斷點(diǎn)“Num”,使其無效,其中“Num”為 info breakpoints 中顯示的對(duì)應(yīng)值
enable breakpoints Num:打開斷點(diǎn)“Num”,使其重新生效
step:簡(jiǎn)記為 s ,單步跟蹤程序,當(dāng)遇到函數(shù)調(diào)用時(shí),則進(jìn)入此函數(shù)體(一般只進(jìn)入用戶自定義函數(shù))。
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)。
until:當(dāng)你厭倦了在一個(gè)循環(huán)體內(nèi)單步跟蹤時(shí),這個(gè)命令可以運(yùn)行程序直到退出循環(huán)體。
finish: 運(yùn)行程序,直到當(dāng)前函數(shù)完成返回,并打印函數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)值等信息。
stepi或nexti:?jiǎn)尾礁櫼恍C(jī)器指令。
print 表達(dá)式:簡(jiǎn)記為 p ,其中“表達(dá)式”可以是任何當(dāng)前正在被測(cè)試程序的有效表達(dá)式,比如當(dāng)前正在調(diào)試C語言的程序,那么“表達(dá)式”可以是任何C語言的有效表達(dá)式,包括數(shù)字,變量甚至是函數(shù)調(diào)用。
print a:將顯示整數(shù) a 的值
print ++a:將把 a 中的值加1,并顯示出來
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ù)
bt:顯示當(dāng)前程序的函數(shù)調(diào)用堆棧。
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
kill:將強(qiáng)行終止當(dāng)前正在調(diào)試的程序
help 命令:help 命令將顯示“命令”的常用幫助信息
call 函數(shù)(參數(shù)):調(diào)用“函數(shù)”,并傳遞“參數(shù)”,如:call gdb_test(55)
layout:用于分割窗口,可以一邊查看代碼,一邊測(cè)試:
layout src:顯示源代碼窗口
layout asm:顯示反匯編窗口
layout regs:顯示源代碼/反匯編和CPU寄存器窗口
layout split:顯示源代碼和反匯編窗口
Ctrl + L:刷新窗口
quit:簡(jiǎn)記為 q ,退出gdb
當(dāng)然,gdb的功能遠(yuǎn)不止這些,包括多進(jìn)程/多線程/信號(hào)/遠(yuǎn)程調(diào)試等功能在這里均沒有提及,有需要的讀者可以參考其它信息