GDB命令

一. gdb編譯選項(xiàng)(gcc/g++ 在編譯時(shí)加入-g來加入debug信息)

  1. -g0等于不加-g跟伏,即不包含任何調(diào)試信息
  2. -g1包含最小的調(diào)試信息鸠删,一般來說只有在你不需要調(diào)試信息,之需要backtrack信息嚎杨,并且很在意程序大小,或者有其他保密/特殊需求是才會(huì)使用-g1
  3. -g2為gdb默認(rèn)崇猫,包含絕大多數(shù)你需要的調(diào)試信息
  4. -g3包含額外的調(diào)試信息诅福,例如包含宏定義信息

二. gdb常見用法

  1. 調(diào)試程序
    1.gdb ${application} 進(jìn)入gdb后匾委,輸入run(簡(jiǎn)寫r) ${arg1} ${arg2}...${argN}
    2.gdb --args ${application} ${arg1}${arg2}...${argN},進(jìn)入gdb后運(yùn)行run
    3.gdb進(jìn)入gdb,輸入file ${application}氓润。然后使用set args ${arg1}${arg2}...${argN}設(shè)定好程序的參數(shù)然后再run
  2. 調(diào)試正在運(yùn)行的程序
    gdb ${application} ${pid}
  3. 調(diào)試core文件
    gdb ${application} ${core文件}
    三. 常用命令
  4. backtrack:顯示棧信息赂乐,簡(jiǎn)寫為bt
  5. frame x: 切換到第x幀。其中x會(huì)在bt命令中顯示咖气,從0開始挨措,0表示棧頂,簡(jiǎn)寫為f
  6. up/down x往棧頂/棧底移動(dòng)x幀崩溪,當(dāng)省略x時(shí)默認(rèn)為1
    4 print x打印x信息浅役,x可以是變量、對(duì)象或者數(shù)組伶唯,簡(jiǎn)寫為p
  7. print */&x打印出x的內(nèi)容或者地址
  8. call調(diào)用函數(shù)觉既,注意該命令需要一個(gè)正在運(yùn)行的程序
  9. set substitute-path from_path to_path替換源代碼文件。當(dāng)編譯機(jī)與運(yùn)行機(jī)代碼路徑不同是需要用該命令替換代碼路徑乳幸,否則你無法看到源代碼
  10. break x.cpp:n在x.cpp第n行設(shè)置斷點(diǎn)瞪讼,然后gdb會(huì)給出斷點(diǎn)編號(hào)m。命令看簡(jiǎn)寫為b后面會(huì)有break命令的詳細(xì)解釋
  11. command m設(shè)置程序執(zhí)行到斷點(diǎn)m處要查看的內(nèi)容如:
    command n
    >printf "x is %d \n", x
    >c
    >end
    //如果command命令后面沒有n則默認(rèn)為最后一 個(gè)breakpoint
  12. x /nfu ${addr}打印addr的內(nèi)容粹断。addr可以是任何合法的地址表達(dá)式符欠,如0x562fb3d、一個(gè)有效的指針p或者有效的變量地址(&var)姿染,/nfu是格式n表示要查看的長(zhǎng)度背亥,f表示格式(例如16進(jìn)制/10進(jìn)制),u表示單位(例如單字節(jié)b悬赏,雙字h狡汉,四字w)一個(gè)例子:
    (gdb) x /3xw 0x562fb3d //即以16進(jìn)制顯示地址0x562fb3d處的3個(gè)單位,每個(gè)單位4字節(jié)內(nèi)容
  13. continue繼續(xù)運(yùn)行程序闽颇,可簡(jiǎn)寫為c
  14. until直到當(dāng)前循環(huán)完成盾戴,可簡(jiǎn)寫為u
  15. step單步調(diào)試,步入當(dāng)前函數(shù)兵多,可簡(jiǎn)寫為s
  16. next單步調(diào)試尖啡,布過當(dāng)前函數(shù)橄仆,可簡(jiǎn)寫為n
  17. finish執(zhí)行到當(dāng)前函數(shù)返回,步出當(dāng)前函數(shù)
  18. set var x=2改變變量x的值衅斩,也可以這樣使用:set {int}0x32075598 = 2把內(nèi)存0x32075598的內(nèi)容解釋為int并修改其內(nèi)容為2
  19. info locals打印當(dāng)前棧幀的本地變量
  20. jump使當(dāng)前執(zhí)行程序調(diào)整到某一行盆顾,或者跳轉(zhuǎn)到某個(gè)地址。由于只會(huì)使程序跳轉(zhuǎn)而不會(huì)改變棧值畏梆,因此若跳出函數(shù)到另外的地方 會(huì)導(dǎo)致return出錯(cuò)您宪。另外,熟悉匯編的人都知道奠涌,程序運(yùn)行時(shí)宪巨,有一個(gè)寄存器用于保存當(dāng)前代碼所在的內(nèi)存地址。所以溜畅,jump命令也就是改變了這個(gè)寄存器中的值捏卓。于是,你可以使用“set $pc”來更改跳轉(zhuǎn)執(zhí)行的地址慈格。如: set $pc = 0x485
  21. return強(qiáng)制函數(shù)返回可以指定返回值

四. 程序中斷機(jī)制:監(jiān)視點(diǎn)(watchpoint)和捕捉點(diǎn)(catchpoint)

  1. 監(jiān)視點(diǎn):監(jiān)視內(nèi)存某個(gè)地址怠晴,一旦該地址的內(nèi)容被改變,程序就進(jìn)入調(diào)試器峦椰。監(jiān)視點(diǎn)又分為軟件模式和硬件模式:軟件監(jiān)視是gdb單步執(zhí)行程序的同時(shí)測(cè)試變量的值龄寞,所以速度會(huì)變慢。同時(shí)軟件監(jiān)視只在當(dāng)前線程有效汤功,幸運(yùn)的是32位intelx86提供了4個(gè)特殊的調(diào)試寄存器用來方便調(diào)試程序物邑,gdb可以使用這些寄存器建立硬件監(jiān)視然而,可用的(enable的)硬件監(jiān)視點(diǎn)的個(gè)數(shù)是有限的滔金。如果你設(shè)置了過多的硬件監(jiān)視點(diǎn)色解,當(dāng)程序從中斷的狀態(tài)變?yōu)閳?zhí)行的狀態(tài)(例如continue,until或者finish)時(shí)餐茵,GDB 可能無法把它們?nèi)考せ羁蒲帧A硗猓顒?dòng)的硬件監(jiān)視點(diǎn)的數(shù)量只有在試圖繼續(xù)執(zhí)行程序時(shí)才能知道忿族,也就是說锣笨,即使你設(shè)置了過多的硬件監(jiān)視點(diǎn),gdb在你運(yùn)行程序之前也不會(huì)警告你道批。設(shè)置監(jiān)視點(diǎn)的命令有3個(gè):watch(寫監(jiān)視)错英、rwatch(讀監(jiān)視)以及awatch(讀寫監(jiān)視),他們的使用方法一樣都為以下幾種:
    1.(r/a)watch x:x為變量隆豹,當(dāng)x的值改變/被讀取時(shí)椭岩,程序進(jìn)入調(diào)試器
    2.(r/a)watch 0xN:N為有效地址
    3.(r/a)watch (int)0xN:N為有效地址當(dāng)該地址int型指針指向的內(nèi)容改變時(shí)進(jìn)入調(diào)試器
    4.(r/a)watch -l (int)0xN:較上一個(gè),該地址本身變化也會(huì)進(jìn)入調(diào)試器
  2. 斷點(diǎn),斷點(diǎn)break有一些變體:tbreak判哥、hbreak献雅、thbreak與rbreak。tbreak和break功能相同塌计,只是所設(shè)置的斷點(diǎn)在觸發(fā)一次后自動(dòng)刪除挺身,hbreak是一個(gè)硬件斷點(diǎn),thbreak是一個(gè)臨時(shí)硬件斷點(diǎn)夺荒。注意硬件斷點(diǎn)需要硬件支持瞒渠,某些硬件可能不支持這類斷點(diǎn)。rbreak稍稍特殊些技扼,它會(huì)在匹配正則表達(dá)式的全部位置加上斷點(diǎn),該斷點(diǎn)后面還有詳述嫩痰。非rbreak斷點(diǎn)的用法:
    1.(t/h)break x.cpp:y:在文件x.cpp第y行加斷點(diǎn)剿吻,x.cpp若不指定則在當(dāng)前文件第y行加斷點(diǎn),若程序未執(zhí)行則以包含main函數(shù)的文件設(shè)置斷點(diǎn)串纺,若x.cpp和y都不指定則以當(dāng)前debuger的點(diǎn)作為斷點(diǎn)
    2.(t/h)break 0xN:在地址0xN處加斷點(diǎn)丽旅,N為有效的代碼段地址
    3.(t/h)break x.cpp:func:在x.cpp的函數(shù)func入口處加斷點(diǎn)
    4.(t/h)break +/-N:在當(dāng)前運(yùn)行處第N行后/前加斷點(diǎn)
    5.rbreak REGEXP:在所有符合正則表達(dá)式的函數(shù)入口處加斷點(diǎn),如:rbreak EX_*表示所有符合以EX_開頭的函數(shù)入口處加斷點(diǎn)纺棺。注意break后面還有兩個(gè)可選參數(shù):線程id和條件榄笙,線程id指在info threads中的線程序號(hào),而非系統(tǒng)提供的tid祷蝌,例如break x.cpp:y 2 if(a == 24)表示在2號(hào)線程的x.cpp文件第y行加入斷點(diǎn)并且只有當(dāng)a==24茅撞,程序才會(huì)觸發(fā)斷點(diǎn)另外,breakpoint可以通過save命令保存巨朦,方便下次再次進(jìn)入程序調(diào)試時(shí)不再需要需要重新設(shè)置斷點(diǎn)
  3. 捕捉點(diǎn)是當(dāng)某些事件發(fā)生時(shí)米丘,程序進(jìn)入調(diào)試狀態(tài),如catch一個(gè)exception糊啡、assert拄查、signal,fork甚至syscall棚蓄。tcatch和catch功能一樣堕扶,區(qū)別是tcatch是臨時(shí)的,catch一次后就會(huì)自動(dòng)刪除

五. 跟蹤點(diǎn)(tracepoint)
跟蹤點(diǎn)與上面介紹的不同之處在于梭依,他只是跟蹤記錄信息而不會(huì)中斷程序的運(yùn)行稍算。tracepoint可以通過save保存,方便下次繼續(xù)使用睛挚。

六. 檢查點(diǎn)
gdb可以保存程序某個(gè)時(shí)間點(diǎn)的程序狀態(tài)或者程序映像邪蛔,并且稍后又可以返回到這個(gè)狀態(tài),這稱為checkpoint。每個(gè)檢查點(diǎn)是進(jìn)程的一份拷貝侧到,這樣當(dāng)一個(gè)bug很難重現(xiàn)勃教,而又擔(dān)心調(diào)試過了頭時(shí)又要重頭開始,這時(shí)候可以設(shè)置checkpoint匠抗,這樣即使調(diào)試過頭了故源,也可以直接從該checkpoint開始,而不用重新重啟整個(gè)程序(也許需要很久9场I!)矢腻。但是每個(gè)checkpoint有自己的唯一進(jìn)程id门驾,這個(gè)pid與原程序的pid是不同的,因此程序需要使用pid信息時(shí)需要慎重考慮多柑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奶是,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子竣灌,更是在濱河造成了極大的恐慌聂沙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初嘹,死亡現(xiàn)場(chǎng)離奇詭異及汉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屯烦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門坷随,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漫贞,你說我怎么就攤上這事甸箱。” “怎么了迅脐?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵芍殖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谴蔑,道長(zhǎng)豌骏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任隐锭,我火速辦了婚禮窃躲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钦睡。我一直安慰自己蒂窒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洒琢,像睡著了一般秧秉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衰抑,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天象迎,我揣著相機(jī)與錄音,去河邊找鬼呛踊。 笑死砾淌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谭网。 我是一名探鬼主播汪厨,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜻底!你這毒婦竟也來了骄崩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤薄辅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抠璃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站楚,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年搏嗡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窿春。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡采盒,死狀恐怖旧乞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磅氨,我是刑警寧澤尺栖,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站烦租,受9級(jí)特大地震影響延赌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叉橱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一挫以、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃祝,春花似錦掐松、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡句。三九已至,卻和暖如春量没,著一層夾襖步出監(jiān)牢的瞬間玉转,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工殴蹄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留究抓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓袭灯,卻偏偏與公主長(zhǎng)得像刺下,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稽荧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容