GDB基本用法

一筷黔、編譯運(yùn)行

1.1鞠眉、程序帶調(diào)試信息

????使用額外的 '-g' 選項(xiàng)來編譯程序:

gcc -g eg.c -o eg


1.2 運(yùn)行 gdb

裝載程序

方法一:在 shell 中,可以使用 'gdb' 命令并 指定程序名 作為參數(shù)來運(yùn)行 gdb

gdb + 程序名

方法二:在 gdb 中歹颓,可以使用 file 命令來裝入要調(diào)試的程序

(gdb)file + 文件名

兩種方式都假設(shè)您是在包含程序的目錄中執(zhí)行命令奢米。

命令? ? ? ? ? ? ? ?縮寫????????????????????????????功能

run? ? ? ? ? ? ? ? ? ?r???????????? ????????????????運(yùn)行程序

continue? ? ? ? ? c (fg)? ? ? ? ? ?繼續(xù)執(zhí)行直到下一次斷點(diǎn)

until +行號(hào)? ? ? ?u? ? ? ? ? ? ? ? ? ? ? ?繼續(xù)執(zhí)行直到指定行

每次執(zhí)行結(jié)束重新輸入 run 可重新執(zhí)行

參數(shù)設(shè)置

裝入程序之后,可以用 gdb 命令 'run + 運(yùn)行參數(shù)' 來啟動(dòng)程序讶迁。

run + 參數(shù)? ? ? ? ? ? ? ? ? ? # 啟動(dòng)程序 或者? restart?

或者在執(zhí)行run前 通過 set args + 運(yùn)行參數(shù) 設(shè)置

set args + 運(yùn)行參數(shù)

run

如果一切正常连茧,程序?qū)?zhí)行到結(jié)束(要是不想讓其結(jié)束要提前設(shè)置斷點(diǎn)),此時(shí) gdb 將重新獲得控制巍糯。

1.3 退出gdb

quit [退出條件]? ? ? ? ? ? ? ? ? ? ?# 退出gdb

二啸驯、調(diào)試命令

2.1?設(shè)置斷點(diǎn)

普通斷點(diǎn)

命令????????縮寫? ? ????用法1????????????????用法2????????????????????????????????????????用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

break? ? ? ?b? ? ? ? ? ? b + 函數(shù)名? ? ? ? ?b + 行號(hào)(文件名:行號(hào))? ? ????b + *地址(*0x7c00)? ? ??

查看斷點(diǎn)

info breakpoints

條件斷點(diǎn)

(1) break + .. + if? 條件

(2) condition 斷點(diǎn)號(hào) 條件

根據(jù)規(guī)則設(shè)置斷點(diǎn)

rbreak printNum*? ? ? ? ? ? #所有以printNum開頭的函數(shù)都設(shè)置了斷點(diǎn)

rbreak .? ? ? ? ? ? ? ? ? ? ? ? ? ?#對(duì)所有函數(shù)設(shè)置斷點(diǎn)

rbreak test.c: . ????????????????#對(duì)test.c中的所有函數(shù)設(shè)置斷點(diǎn)

rbreak test.c:^print ????????#對(duì)以print開頭的函數(shù)設(shè)置斷點(diǎn)

臨時(shí)斷點(diǎn)

斷點(diǎn)只想生效一次,可以設(shè)置臨時(shí)斷點(diǎn)

tbreak test.c:l0? #在第10行設(shè)置臨時(shí)斷點(diǎn)

刪除斷點(diǎn)

clear? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #刪除當(dāng)前行所有breakpoints

clear function? ????????????????????????????????#刪除函數(shù)名為function處的斷點(diǎn)

clear filename:function? ? ? ? ? ? ? ? ? ? #刪除文件filename中函數(shù)function處的斷點(diǎn)

clear lineNum? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #刪除行號(hào)為lineNum處的斷點(diǎn)

clear filename:lineNum ????????????????#刪除文件filename中行號(hào)為lineNum處的斷點(diǎn)

delete? ????????????????????????????????????????????#刪除所有breakpoints,watchpoints和catchpoints

delete bnum ????????????????????????????????????#刪除斷點(diǎn)號(hào)為bnum的斷點(diǎn)

跳過多次設(shè)置斷點(diǎn)

ignore +? 斷點(diǎn)號(hào)? +? ?忽略次數(shù)

Num? ? Type? ? ? ? ? Disp Enb Address? ? ? ? ? ? What

1? ? ? breakpoint? ? keep y? 0x00000000004005e8 in printNum2 at test.c:16? ignore next 30 hits

根據(jù)表達(dá)式值變化產(chǎn)生斷點(diǎn)

需要觀察某個(gè)值或表達(dá)式祟峦,知道它什么時(shí)候發(fā)生變化

watch + 變量或者表達(dá)式的值

watch + 條件

讓程序繼續(xù)運(yùn)行罚斗,如果值發(fā)生變化,則會(huì)打印相關(guān)內(nèi)容宅楞,如:

Hardware watchpoint 2: a

Old value = 12

New value = 11

其? info breakpoints 信息

Num ???? Type ???????????????? Disp ????????Enb ????????????Address ???????? What

2? ? ? ???? hw watchpoint? ????keep ????????y? ? ? ? ? ? ? ? ? ? ? a? ?????????????breakpoint already hit 11 times

禁用或啟動(dòng)斷點(diǎn)

有些斷點(diǎn)暫時(shí)不想使用针姿,但又不想刪除,可以暫時(shí)禁用或啟用厌衙。例如:

disable? ????????????????????????????#禁用所有斷點(diǎn)

disable bnum? ? ? ? ? ? ? ? ? ? #禁用標(biāo)號(hào)為bnum的斷點(diǎn)

enable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#啟用所有斷點(diǎn)

enable bnum ????????????????????#啟用標(biāo)號(hào)為bnum的斷點(diǎn)

enable delete bnum? ????????#啟動(dòng)標(biāo)號(hào)為bnum的斷點(diǎn)距淫,并且在此之后刪除該斷點(diǎn)


2.2 單步執(zhí)行

命令????????縮寫? ? ????用法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用法1

next? ? ? ? ? ?n? ? ? ? ? 執(zhí)行一行源程序代碼,不進(jìn)入函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?n + 步數(shù)

step? ? ? ? ? ?s? ? ? ? ? 執(zhí)行一行源程序代碼婶希,單步跟蹤進(jìn)入函數(shù)? ? ? ? ? ? ? ? ? s?+ 步數(shù)

nexti? ? ? ? ? ?ni? ? ? ? ? 執(zhí)行一行匯編程序代碼榕暇,不進(jìn)入函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ni + 步數(shù)

stepi? ? ? ? ? ?si? ? ? ? ? 執(zhí)行一行匯編程序代碼,單步跟蹤進(jìn)入函數(shù)? ? ? ? ? ? ?si + 步數(shù)

finish???????????????????????跳過該函數(shù),繼續(xù)后面的執(zhí)行

2.3 查看變量

在查看變量之前彤枢,需要先啟動(dòng)調(diào)試并設(shè)置斷點(diǎn)

命令? ? ?縮寫? ? ? ?   用法1? ? ? ? ? ? ? ????????????????????????????用法2? ? ? ? ? ? ? ? ? ? ??

print? ? ? ?p? ? ?   ? p + 變量名? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p + 數(shù)組名? ? ??

?命令? ? ?縮寫? ? ? ? ?   用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用法4????????????????????????????用法5

print? ? ? ?p?? ? ? ? ? ? ? p + 文件名(函數(shù)名) :: 變量名? ? ? ? p + *(地址或指針)? ? ? ? p + *指針@數(shù)量

環(huán)境變量$

$? 可表示上一個(gè)變量撤蟆,假設(shè)此時(shí)有一個(gè)鏈表linkNode,它有next成員代表下一個(gè)節(jié)點(diǎn)堂污,則可使用下面方式不斷打印鏈表內(nèi)容:

(gdb) p *linkNode? ? ? ? ? ? #顯示linkNode節(jié)點(diǎn)內(nèi)容

(gdb) p *$.next? ? ? ? ? ? ? ? #顯示linkNode節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)的內(nèi)容

如果想要查看前面數(shù)組的內(nèi)容,你可以將下標(biāo)一個(gè)一個(gè)累加龄砰,還可以定義一個(gè)類似UNIX環(huán)境變量盟猖,這樣就不需要每次修改下標(biāo)去打印,例如:

(gdb) set $index=0

(gdb) p b[$index++]

$11 = 1

(gdb) p $pc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 當(dāng)前指令

2.4 打印格式

x 按十六進(jìn)制格式顯示變量换棚。????????d 按十進(jìn)制格式顯示變量式镐。????????????o 按八進(jìn)制格式顯示變量。

t 按二進(jìn)制格式顯示變量固蚤。????????????c 按字符格式顯示變量娘汞。????????????????f 按浮點(diǎn)數(shù)格式顯示變量。

(gdb) p/x c

2.5 查看內(nèi)存

命令? ? ? ? ? ? ? 用法? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????用法1? ? ? ? ? ? ??

? ?x? ? ? ? ? ? ? ?查看內(nèi)存內(nèi)容 ????????x / [n內(nèi)存單元數(shù)] [f格式] [u單元長(zhǎng)度] addr地址? ? ?

格式

t 二進(jìn)制? ? ? ? ? ?????x 十六進(jìn)制? ? ? ? ? ? ????d 十進(jìn)制? ? ? ? ? ? o 八進(jìn)制????????????????????????u 十進(jìn)制無符號(hào)

c 字符? ? ? ? ? ? ?????s 字符串? ? ? ? ? ? ? ? ????f 浮點(diǎn)數(shù)? ? ? ? ? ? ?z 零拓展十六進(jìn)制? ? ? ? ? a? 地址單元的長(zhǎng)度? ? ?

i 指令地址格式? ? ?

單元長(zhǎng)度

b 字節(jié)????????????h? 雙字節(jié)????????????????w? 四字節(jié)????????????g 八字節(jié)

默認(rèn)是4個(gè)byte

查看堆棧信息

x /8x $esp


2.6 自動(dòng)顯示變量

程序斷住時(shí)夕玩,就顯示某個(gè)變量的值

命令? ? ? ? ? ? ? ? ? ? ? 用法? ? ? ? ? ? ? ? ? ? ? ? ? ?用法1

display? ? ? ? ? ? ? ?查看變量名? ? ? ? ? ? ?display + 變量名

清除變量

delete display num ????????????# num變量的編號(hào)你弦,不帶num時(shí)清除所有變量

去使能

disable display num????????? # num為變量的編號(hào),不帶num時(shí)去使能所有

2.4 info

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 縮寫? ? ? ? ? ????????? 功能

info? breakpoints? ? ? ? ? ?i? b? ? ? ????????????查看已設(shè)置斷點(diǎn)

info? watchpoints? ? ? ? ? ?i? wat? ? ? ? ? ? ? 查看已設(shè)置觀測(cè)點(diǎn)

info registers? ? ? ? ? ? ? ? ?i? r? ? ???????????????查看所有寄存器

info skip? ? ? ? ? ? ? ? ? ? ? ? i? s???????????????????查看所有需要跳過的函數(shù)?

info local? ? ? ? ? ? ? ? ? ? ? ?i lo? ? ? ? ? ? ? ? ? ? 查看當(dāng)前函數(shù)局部變量

help? info可查看更多

2.7 skip

命令? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????功能

skip + 函數(shù)名????????????????????單步執(zhí)行時(shí)跳過一些不想關(guān)注的函數(shù)

skip? file + 文件名? ? ? ? ? ? ?單步執(zhí)行時(shí)跳過某個(gè)文件的代碼

skip delete [num]? ? ? ? ? ? ? 刪除對(duì)應(yīng)編號(hào)skip

skip enable [num] ????????????使能對(duì)應(yīng)編號(hào)skip

skip disable [num] ????????????去使能對(duì)應(yīng)編號(hào)skip

三燎孟、查看源碼

3.1 list

list 列出指定行附件的源碼

命令? ? ? ? ? ? 縮寫? ? ? ? ? ? ? ? 用法1? ? ? ? ? ? 用法2? ? ? ? ? ? ? ? 用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用法4

list? ? ? ? ? ? ? ? ? l? ? ? ? ? ? ? ? ? ? l + 行號(hào)? ? ? ? l + 函數(shù)名? ? ? ? ? l 行號(hào) 禽作, 行號(hào)(指定范圍)? ? ? l + 文件名:行號(hào)

set listsize 20? ? ? ? ? ? # 顯示 每次顯示的行數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揩页,隨后出現(xiàn)的幾起案子旷偿,更是在濱河造成了極大的恐慌,老刑警劉巖爆侣,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萍程,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兔仰,警方通過查閱死者的電腦和手機(jī)茫负,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎赴,“玉大人朽褪,你說我怎么就攤上這事∥扌椋” “怎么了缔赠?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)友题。 經(jīng)常有香客問我嗤堰,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任踢匣,我火速辦了婚禮告匠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘离唬。我一直安慰自己后专,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布输莺。 她就那樣靜靜地躺著戚哎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫂用。 梳的紋絲不亂的頭發(fā)上型凳,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音嘱函,去河邊找鬼甘畅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛往弓,可吹牛的內(nèi)容都是我干的疏唾。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼函似,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荸实!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缴淋,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤准给,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后重抖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體露氮,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年钟沛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畔规。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恨统,死狀恐怖叁扫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畜埋,我是刑警寧澤莫绣,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站悠鞍,受9級(jí)特大地震影響对室,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一掩宜、第九天 我趴在偏房一處隱蔽的房頂上張望蔫骂。 院中可真熱鬧,春花似錦牺汤、人聲如沸辽旋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补胚。三九已至,卻和暖如春锅减,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伐坏。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工怔匣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桦沉。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓每瞒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親纯露。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剿骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過程,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,512評(píng)論 0 26
  • 概述 GDB是一個(gè)由GNU開源組織發(fā)布的埠褪、UNIX/Linux操作系統(tǒng)下的浓利、基于命令行的、功能強(qiáng)大的程序調(diào)試工具钞速。...
    咕咕鷄閱讀 20,745評(píng)論 0 8
  • 調(diào)試前準(zhǔn)備 獲取進(jìn)程的內(nèi)核轉(zhuǎn)儲(chǔ)(core dump) why:最大好處是贷掖,其保存了問題發(fā)生時(shí)的狀態(tài)。記錄進(jìn)程當(dāng)前狀...
    Gitlusen閱讀 920評(píng)論 0 2
  • 放假了渴语,最開心的事莫過于早上開機(jī)時(shí)苹威。 “老師,祝您春節(jié)快樂驾凶!” “老師牙甫,春節(jié)愉快!雖然發(fā)的有些晚调违,但是心意不變噢窟哺!...
    魏喜梅wxm閱讀 553評(píng)論 12 11
  • 點(diǎn)進(jìn)來你就輸了,單身狗沒有樂趣 點(diǎn)進(jìn)來你就輸了技肩,單身狗沒有樂趣 點(diǎn)進(jìn)來你就輸了脏答,單身狗沒有樂趣 言歸正傳,單身狗有...
    土_豆_粉閱讀 310評(píng)論 8 6