詳解gdb的使用技巧

01?概念

????GDB是一個由GNU開源組織發(fā)布的叫胁、UNIX/LINUX操作系統(tǒng)下的亡问、基于命令行的、功能強大的程序調試工具引瀑。

????在實際應用中狂芋,有兩種調試方法:在線調試和離線調試。

????離線調試適用于開發(fā)測試環(huán)境憨栽,可以自由啟停進程帜矾,設置斷點;在線調試一般用于現(xiàn)場問題分析屑柔,不能隨便啟停進程屡萤,對于技術要求較高。

02?前提條件

2.1 編譯

????若想執(zhí)行gdb調試掸宛,在Makefile文件中需要增加編譯調試選項-g灭衷,例如:

????gdb?dup_file.c –o dum_file_elf?–g?–lpthread

? ? 說明:-g選項的作用是在可執(zhí)行文件(ELF)中加入源代碼的相關信息,比如ELF中第幾條機器指令對應源代碼的行數(shù)旁涤。但不是把整個源文件嵌入到可執(zhí)行文件中翔曲,所以在調試時必須保證gdb能找到源文件迫像。

????-g完整格式是-glevel,其中瞳遍,level中指定了調試信息中包含了調試信息的多少闻妓,默認的是2,level=1最少,level=3最多掠械。

2.2 readelf查看段信息

????例如:

????readelf -S?helloWorld|grep debug

????注:helloWorld為文件名由缆,如果沒有任何debug信息,則不能被調試猾蒂。

2.3 file查看strip狀況

????下面的情況也是不可調試的:

????file?helloWorld

? ? helloWorld: (省略前面內容)?stripped

????注:如果最后是stripped均唉,則說明該文件的符號表信息和調試信息已被去除,不能使用gdb調試肚菠。但是not stripped的情況并不能說明能夠被調試舔箭。

03?使用方法

3.1 啟動調試

????在開發(fā)中可以將源碼和可執(zhí)行文件拷貝到某一目錄下,使用gdb啟動進程進行調試蚊逢,也可以不拷貝源碼和可執(zhí)行文件层扶,使用NFS掛載到編譯環(huán)境執(zhí)行調試;在現(xiàn)場環(huán)境中使用ps獲取進程的pid烙荷,然后gdb –p pid執(zhí)行在線調試镜会。

????離線調試:

????gdb 進程名

????gdb –tui 進程名

????在線調試:

????ps –A | grep 進程名

????gdb –p pid/gdb attach pid

????說明:使用-tui參數(shù)可以將調試窗口分為兩部分:上面是源碼,下面是調試信息终抽,使用Ctrl+n/Ctrl+p或者方向鍵進行翻頁戳表。

????帶參數(shù)調試:

????1、啟動的時候帶上參數(shù)

????gdb --args xxx 參數(shù)

????2昼伴、啟動之后 run 帶上參數(shù)

????# gdb xxx

????(gdb)run 參數(shù)

????3扒袖、啟動之后 set args 設置參數(shù)

????# gdb xxx

????(gdb)set args 參數(shù)

? ??core文件調試

????當程序core dump時,可能會產生core文件亩码,它能夠很大程序幫助我們定位問題季率。但前提是系統(tǒng)沒有限制core文件的產生∶韫担可以使用命令limit -c查看:

????$ ulimit -c

????如果結果是0飒泻,即便程序core dump了也不會有core文件留下盖奈。我們需要讓core文件能夠產生:

????ulimit -c unlimied ?#表示不限制core文件大小

ulimit -c 10??#設置最大大小案腺,單位為塊,一塊默認為512字節(jié)

????上面兩種方式可選其一倔监。第一種無限制席覆,第二種指定最大產生的大小史辙。

????針對生成core文件進行調試,可以采用在線加載和離線加載的方式,如下:

??gdb?可執(zhí)行文件 core文件

3.2 SET命令

????注:有時候使用p打印調試信息不完整或者不便于閱讀聊倔,可以使用set print elelent 0和setprint pretty on設置晦毙。

3.3 handle命令

????handle命令

????handle SIGUSR1 nostop noprint

????handle SIGUSR2 nostop noprint

????handle SIGPIPE nostop noprint

????handle SIGALARM nostop

????handle SIGHUP nostop

????handle SIGTERM nostop noprint

????注:設置GDB調試時對信號的相關動作。

3.4 設置斷點

????打斷點還是比較有技巧的耙蔑,雖然有很多打斷點的方法见妒,但是實際調試中一般就使用以下幾種:

???函數(shù)打斷點:b 函數(shù)名

???某一行打斷點:b 源文件:行號

? ??條件斷點:

????break?斷點 if?條件

????continue?斷點編號(執(zhí)行一次表示設定,再次執(zhí)行表示取消)

????continue?斷點編號 條件

? ? 注:條件斷點非常有用甸陌,實際調試中往往需要調試特定場景下函數(shù)調用關系须揣,此時就需要設置斷點觸發(fā)的條件。

? ??查看斷點:info breakpoint/info break/info b

? ??刪除斷點:delete 斷點號/delete(刪除所有斷點)

? ??禁用/開啟斷點:disable/enable breakpoint

? ??ignore:

????斷點條件的一個特殊用法是钱豁,程序只有在到達斷點一定次數(shù)之后才會停止耻卡,此時可以使用指令:

????ignore 斷點編號 次數(shù)

????ignore 2 10觸發(fā)斷點10次后才會停止,每次觸發(fā)斷點count自動減1

????說明:打完斷點是不是執(zhí)行continue就可以等待著運行到斷點了呢牲尺?不一定卵酪,有時候斷點處代碼的執(zhí)行需要外部出發(fā),比如web發(fā)送特定消息后才可以觸發(fā)執(zhí)行秸谢,如果一直等待沒有消息出發(fā)永遠執(zhí)行不到斷點處,此時就需要結合自己的業(yè)務邏輯霹肝,手動設置出發(fā)條件估蹄。

3.5?執(zhí)行程序

????執(zhí)行程序的方法有兩種:一種是從main函數(shù)開始執(zhí)行逐步分析,一種是執(zhí)行到斷點處沫换。

? ??重新運行:r/run

? ??繼續(xù)執(zhí)行:c/continue

? ??單步執(zhí)行:n/next/next N(執(zhí)行N次next)

? ??單步進入:step(遇到函數(shù)進入函數(shù)內部臭蚁,退出函數(shù)時使用finish)

? ??結束函數(shù):finish

????強制返回:return(忽略當前未執(zhí)行的部分,強制返回)

3.6?顯示堆棧

????(gbd)?backstrace/bt

????有時候跳轉的次數(shù)太多讯赏,不知道具體調用的層級關系了垮兑,可以使用bt查看堆棧,該命令會產生一張列表漱挎,包含著運行過程和相關的參數(shù)系枪。

3.7 變量操作

??設置變量:set 變量=表達式

????在調試的時候,有時候需要設置一些假數(shù)據(jù)查看對應輸出磕谅,比如根據(jù)布爾值查看流程執(zhí)行情況私爷,此時就需要在執(zhí)行到指定位置時手動設置一下數(shù)據(jù)的取值。

???監(jiān)控變量:

????watch 變量 (數(shù)值改變時暫停運行)

????awatch <表達式> (被訪問或改變時暫停運行)

????rwatch <表達式>? (被訪問時暫停運行)

????有時候我們需要觀察一個變量的變化過程膊夹,比如一個全局變量如何初始化衬浑,如何調用的,這就需要使用watch監(jiān)控變量放刨。

? ??變量類型:

????ptype?var 變量類型

????whatis?var?顯示一個變量var的類型

? ??打印變量/表達式:

? ??打印變量:p 變量??????

? ??打印字符/表達式:p “%s”,字符/表達式

? ??格式化輸出:p/格式控制符 打印內容

????說明:

??? gdb可支持的變量顯示格式有:

??? x:按16進制格式顯示變量

??? d:按10進制格式顯示變量

??? u:按16進制格式顯示無符號整型

??? o:按8進制格式顯示變量

??? t:按2進制格式顯示變量

??? c:按字符格式顯示變量

??? f:按浮點數(shù)格式顯示變量

????也可以使用x(Examination)來打印需要顯示的字符信息工秩,格式如下:

????x/格式 地址

????格式(可選)一般是NFU:

????1、N表示重復次數(shù)(表示顯示內存的長度,也就是說從當前向后顯示幾個地址的內容)

????2助币、F表示顯示格式

??? 3浪听、U表示單位(b:字節(jié),h:半字[2字節(jié)]奠支,w:字[4字節(jié)馋辈,默認],g:雙字[8字節(jié)])倍谜。表示多少個字節(jié)作為一個值取出來迈螟,如果不指定的話,GDB默認是1個byte尔崔,當我們指定了字節(jié)長度后答毫,GDB會從指定內存的地址開始,讀取指定字節(jié)季春,并把其作為一個值取出來洗搂。

????參數(shù)u可使用下面字符代替:

??? b:表示單字節(jié)

??? h:表示雙字節(jié)

??? w:表示四字節(jié)

??? g:表示八字節(jié)

3.8 調試函數(shù)

? ??disassemble????

????可以使用反匯編的指令disassemble去探究究竟在函數(shù)中發(fā)生了哪些操作,具體如下:

????1载弄、disassemble

????2耘拇、disassemble?程序計數(shù)器

????3、disassemble?開始地址 結束地址

????格式1表示反匯編當前整個函數(shù)宇攻,格式2表示反匯編計數(shù)器所在函數(shù)的整個函數(shù)惫叛,格式3表示反匯編從開始地址到結束地址的部分。

????call

????強制調用函數(shù):call 表達式

3.9?退出調試

? ? q/quit

????在執(zhí)行到斷點后逞刷,采用q/quit指令退出嘉涌。

04?多進程調試

4.1 配置

????detach-on-fork

????該屬性決定了gdb是同時調試父子進程,還是在fork了子進程之后夸浅,將子進程分離出去仑最。

??? on:子進程(或者父進程,取決于gdb在初始時帆喇,要調試的進程警医,也就是follow-fork-mode的值)

??? off:同時調試父子進程,一個進程處于被調試的狀態(tài)坯钦,而另一個則被gdb掛起

設置:set detach-on-fork on/off

????follow-fork-mode

????該屬性決定了gdb在進程調用fork之后的行為法严。

??? set follow-fork-mode parent:默認情況下,在調用fork之后葫笼,gdb選擇跟隨(也就是調試)父進程深啤,而子進程則在處于運行的狀態(tài)(此時父進程處于阻塞的狀態(tài))。

??? set follow-fork-mode child:fork之后gdb選擇調試子進程路星,而父進程處于運行的狀態(tài)溯街。

4.2 查看進程

????查看當前調試的進程:info inferiors

05?多線程調試

5.1查看線程

? ??查看線程:info threads

????注:輸出信息前面有“*”表示調試的當前線程(一般thread切換線程后查看)诱桂。

????有的程序會在運行過程中主線程創(chuàng)建多個子線程,所以前后執(zhí)行info threads顯示的線程數(shù)是會動態(tài)變化的呈昔。

5.2?查看線程堆棧

? ??查看所有線程堆棧:thread apply all bt

? ??查看指定線程堆棧:thread apply thread1 thread2... bt

5.3?切換線程

????切換線程:thread N

????注:通過打印counter挥等,可以看到多個線程都是在運行的,如果想要讓其他線程處于停止狀態(tài)堤尾,只有當前調試的線程執(zhí)行肝劲,可以采用set scheduler-locking on。

5.4 阻塞線程

????阻塞其他線程郭宝,僅調試當前線程工作:

?set?scheduler-locking [on|off|step]

????運行指定線程并允許其他線程并行執(zhí)行:

????thread apply N command

06?總結

????對于C語言開發(fā)辞槐,必須熟練使用gdb進行調試,這可以幫助我們快速定位問題并解決問題粘室,在開發(fā)中可以幫助我們及時找到測試出現(xiàn)的問題榄檬,在現(xiàn)場問題中如果日志打印不是很充分,日志信息量不夠的情況下衔统,gdb調試顯得非常重要鹿榜。

????在實際應用中,我們通常是利用gdb分析core文件锦爵,這就需要結合寄存器舱殿,匯編,內存相關知識綜合分析险掀,后面會詳細介紹相關分析技巧沪袭。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迷郑,隨后出現(xiàn)的幾起案子枝恋,更是在濱河造成了極大的恐慌创倔,老刑警劉巖嗡害,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異畦攘,居然都是意外死亡霸妹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門知押,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叹螟,“玉大人,你說我怎么就攤上這事台盯“照溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵静盅,是天一觀的道長良价。 經常有香客問我,道長,這世上最難降的妖魔是什么明垢? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任蚣常,我火速辦了婚禮,結果婚禮上痊银,老公的妹妹穿的比我還像新娘抵蚊。我一直安慰自己,他們只是感情好溯革,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布贞绳。 她就那樣靜靜地躺著,像睡著了一般鬓照。 火紅的嫁衣襯著肌膚如雪熔酷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天豺裆,我揣著相機與錄音拒秘,去河邊找鬼。 笑死臭猜,一個胖子當著我的面吹牛躺酒,可吹牛的內容都是我干的。 我是一名探鬼主播蔑歌,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼羹应,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了次屠?” 一聲冷哼從身側響起园匹,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劫灶,沒想到半個月后裸违,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡本昏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年供汛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涌穆。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡怔昨,死狀恐怖,靈堂內的尸體忽然破棺而出宿稀,到底是詐尸還是另有隱情趁舀,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布祝沸,位于F島的核電站矮烹,受9級特大地震影響巡蘸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜擂送,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一悦荒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘹吨,春花似錦搬味、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至问芬,卻和暖如春悦析,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背此衅。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工强戴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挡鞍。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓骑歹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親墨微。 傳聞我的和親對象是個殘疾皇子道媚,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容

  • 一.GDB命令詳解 在linux程序調成中gdb是最常用的工具。 關于gdb的說明可以在linux下直接 man ...
    pengzhixiang閱讀 56,905評論 1 10
  • 本文來自個人博客 sunyongfeng.com翘县。博客的文章保持更新最域,此文可能不是最新狀態(tài)。 簡介 GDB锈麸,GNU...
    sunnogo閱讀 13,199評論 0 8
  • 1.gdb 可執(zhí)行文件 例子:gdb one 2.gdb attach pid 例子:gdb attach 123...
    crazyfolish閱讀 863評論 0 0
  • 程序開發(fā)離不開調試镀脂,可以斷點調試,也可以打log調試掐隐,linux下斷點調試c,c++程序用gdb狗热。 斷點調試雖然很...
    程序大飛閱讀 2,278評論 1 2
  • gdb簡介 gdb命令行調試工具非常強大钞馁,是linux下調試的神器虑省。可以完成四個方面的功能 啟動程序僧凰,按照自定義的...
    ermaot閱讀 151評論 0 0