GDB 常用法

1. 幫助

選項(xiàng) 作用
help 列出所有命令分類
help class 列出分類class中的命令列表
help command 顯示命令command的使用說明

2. 啟動(dòng)

選項(xiàng) 作用
gdb program 開始調(diào)試program
gdb -command=c program 開始調(diào)試progream滑沧,c是本項(xiàng)目的啟動(dòng)文件
gdb program core 調(diào)試program,core作為credump文件
  • 加載程序時(shí)帅涂,gdb嘗試加載啟動(dòng)文件。有兩個(gè)啟動(dòng)文件,一個(gè)是~/.gitinit,屬于當(dāng)前用戶笆凌,另一個(gè)屬于特定項(xiàng)目,用-command選項(xiàng)指定时甚。
  • ~/.gitinit是在加載程序前加載的隘弊,適合一般用途;-command指定的啟動(dòng)文件是在加載程序后加載的荒适,所以特定于項(xiàng)目梨熙,如設(shè)置斷點(diǎn)等。

3. 運(yùn)行程序

選項(xiàng) 作用
run arglist 設(shè)置參數(shù)列表為arglist刀诬,并運(yùn)行程序
run 用當(dāng)前的參數(shù)列表運(yùn)行程序
set args [arglist] 設(shè)置參數(shù)列表為arglist咽扇。如果沒指定arglist,則清空參數(shù)列表
show args 顯示當(dāng)前參數(shù)列表
run ... <inf >outf 輸入陕壹、輸出分別重定向到inf质欲,outf
kill 殺死運(yùn)行中的程序
set env var string 設(shè)置環(huán)境變量var的值為string
show env 列出所有環(huán)境變量
show env var 列出環(huán)境變量var的值
unset env var 刪除環(huán)境變量var

4. 調(diào)試目標(biāo)

選項(xiàng) 作用
target type targ 連接到指定類型typed的目標(biāo)targ,如遠(yuǎn)程機(jī)器
attach process 掛接到指定進(jìn)程
detach 脫離(放棄控制)當(dāng)前進(jìn)程

5. 工作文件

選項(xiàng) 作用
info sharedlib 列出當(dāng)前加載的動(dòng)態(tài)庫

6. 符號(hào)表

選項(xiàng) 作用
info address s 顯示符號(hào)s的地址
info func reg 顯示函數(shù)reg的原型糠馆。regexpr是正則表達(dá)式
info var reg 顯示全局變量reg的定義
whatis expr 顯示expr的類型嘶伟。expr可以是變量或類型
ptype expr 顯示expr的類型。信息比whatis更詳細(xì)

7. Shell命令

選項(xiàng) 作用
cd dir 工作目錄改成dir
pwd 顯示工作目錄
make 調(diào)用make
shell cmd 運(yùn)行Shell命令cmd

8. 斷點(diǎn) breakpoint又碌、監(jiān)視點(diǎn) watchpoint

選項(xiàng) 作用
break [file:] line 在文件file九昧、行l(wèi)ine設(shè)置斷點(diǎn)。b等同于break毕匀。
break [file:] function 在文件file铸鹰、函數(shù)function設(shè)置斷點(diǎn)
break ... if expr 設(shè)置條件斷點(diǎn),如果expr非0皂岔,則停止
cond n [expr] 給斷點(diǎn)n設(shè)置條件蹋笼,如果沒指定expr,則清除條件凤薛。
commands n 給斷點(diǎn)n設(shè)置命令列表姓建。
tbreak ... 設(shè)置臨時(shí)斷點(diǎn),一次有效
info break 顯示所有斷點(diǎn)
clear [file:] line 清除文件file缤苫、行l(wèi)ine的斷點(diǎn)速兔。
clear [file:] function 清除文件file、函數(shù)function的斷點(diǎn)
delete [n] 刪除斷點(diǎn)n活玲。如果沒指定n涣狗,清除所有斷點(diǎn)谍婉。
disable [n] 禁用斷點(diǎn)n。如果沒指定n镀钓,禁用所有斷點(diǎn)穗熬。
enable [n] 啟用斷點(diǎn)n。如果沒指定n丁溅,啟用所有斷點(diǎn)唤蔗。
watch expr 設(shè)置監(jiān)視點(diǎn),如果expr變化窟赏,則停止
info watch 顯示所有監(jiān)視點(diǎn)
  • 斷點(diǎn)妓柜、監(jiān)視點(diǎn)列表
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040087b in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:24
2       hw watchpoint  keep y                      xyz

Num: 編號(hào)
Type: 類型⊙那睿可以是breakpoint棍掐、watchpoint、或catchpoint拷况。
Disp: 部署Disposition作煌,指出gdb下次暫停時(shí)怎樣處理該斷點(diǎn)∽荩可以是keep(保持)粟誓,del(刪除) 或dis(禁用)。
Enb: 當(dāng)前起意,可以是y(啟用)或n(禁用)努酸。
Address: breakpoint在內(nèi)存中的位置。watchpoint這項(xiàng)為空杜恰。
What: breakpoint在源代碼中的位置获诈。watchpoint這項(xiàng)是變量或表達(dá)式名。

  • 如下是設(shè)置條件斷點(diǎn)的一個(gè)例子:
(gdb) break 21 if x == 0
(gdb) info break
7       breakpoint     keep y   0x00000000004007f6 in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:21
    stop only if x == 0
(gdb) cond 7  x < 3
  • 條件斷點(diǎn)的 if 部分可以包含自定義函數(shù):
break 21 if test_var(x)

也可以包含庫函數(shù)心褐,如:

break 21 if strlen(mystring) > 1
  • 給斷點(diǎn)設(shè)置命令列表的一個(gè)例子如下:
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>silent
>printf "x is %d.\n", x
>end
(gdb) info b
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x00000000004008c9 in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:33
    breakpoint already hit 2 times
        silent
        printf "x is %d.\n", x
  • 監(jiān)視點(diǎn)結(jié)合了斷點(diǎn)和變量檢查的概念舔涎。基本的形式是: 當(dāng)變量值發(fā)生變化時(shí)逗爹,暫停程序執(zhí)行亡嫌。
(gdb) watch z

更好的方法是指定條件表達(dá)式。如下的形式是:當(dāng)z的值第一次大于28時(shí)掘而,暫停執(zhí)行挟冠。

(gdb) watch (z>28)
  • 監(jiān)視點(diǎn)指定的變量要處于作用域內(nèi)。一旦離開作用域袍睡,監(jiān)視點(diǎn)被刪除知染。

9. 瀏覽棧幀

選項(xiàng) 作用
backtrace 顯示棧的所有幀。bt等同于backtrace斑胜。
frame n 設(shè)置幀n為當(dāng)前幀
up 設(shè)置父幀為當(dāng)前幀
down 設(shè)置子幀為當(dāng)前幀
frame 顯示當(dāng)前幀
info frame 顯示當(dāng)前幀的局部變量控淡、形參等信息
info args 顯示當(dāng)前幀的參數(shù)
info locals 顯示當(dāng)前幀的本地變量
info reg 顯示當(dāng)前幀的寄存器
  • 棧幀(stack frame)中保存與函數(shù)調(diào)用關(guān)聯(lián)的運(yùn)行時(shí)信息嫌吠。每個(gè)幀保存該層函數(shù)的局部變量、形參掺炭、調(diào)用函數(shù)的位置等辫诅。正在執(zhí)行的函數(shù)幀編號(hào)為0,其父幀編號(hào)依次為1涧狮,以此類推炕矮。

10. 執(zhí)行控制

選項(xiàng) 作用
continue 繼續(xù)執(zhí)行。 c等同與continue
next 單步執(zhí)行者冤,跳過函數(shù)調(diào)用吧享。n等同與next
step 單步執(zhí)行,進(jìn)入函數(shù)調(diào)用譬嚣。s等同與step
until [location] 執(zhí)行到 location 指定的位置
finish 執(zhí)行到當(dāng)前幀返回
signal sig 向進(jìn)程發(fā)送信號(hào)signal并繼續(xù)執(zhí)行
  • 如果沒有指定location, until 運(yùn)行到下一個(gè)指令(內(nèi)存地址比當(dāng)前地址高)钞它。

  • signal的參數(shù)sig可以是signal名字拜银,如:

(gdb) signal SIGINT

也可以是數(shù)字,如:

(gdb) signal 2

11. 顯示變量

選項(xiàng) 作用
set var = expr 變量var賦值為expr
print [/f] expr 按照 /f 指定的格式顯示expr
x [/Nuf] addr 按 /Nuf 指定的格式顯示地址addr處的數(shù)據(jù)
display [/f] expr 每次停止執(zhí)行時(shí)遭垛,自動(dòng)顯示expr的值
undisplay n 刪除display變量
info display 列出所有display變量
printf 類似C函數(shù)printf()的用法
disassem [addr] 顯示匯編代碼
  • print /f expr 中的 f 可以是如下值之一:
x 十六進(jìn)制
d 有符號(hào)十進(jìn)制
u 無符號(hào)十進(jìn)制
a 地址
c 字符
f 浮點(diǎn)數(shù)
s NULL結(jié)尾的字符串
  • x [/Nuf] expr 中尼桶, Nuf依次指定多個(gè)單元 (N)、單元大小(u)锯仪、和單位類型(f)泵督。
    • u可以是如下值之一:
b byte,1個(gè)字節(jié)
h halfword庶喜,2個(gè)字節(jié) 
w words小腊,4個(gè)字節(jié)
g giant word,8個(gè)字節(jié)
  • 使用printf的一個(gè)例子如下:
(gdb) printf "x is %d.\n", x 

printf 一般用于編寫斷點(diǎn)命令久窟、宏這些擴(kuò)展功能秩冈。

12. 瀏覽源代碼

選項(xiàng) 作用
list 從當(dāng)前位置開始,列出后面10行源代碼
list line 列出行l(wèi)ine 前后的源代碼斥扛,line可以是[file:]num入问、[file:]function
list - 從當(dāng)前位置開始,列出前面10行源代碼
list f,l 列出從 f 行到 l 行的源代碼
list file:line 列出指定文件的line行稀颁。這個(gè)命令會(huì)切換當(dāng)前源文件
info sources 顯示正在使用的源文件名列表
info source 顯示當(dāng)前源文件名

13. 多線程

選項(xiàng) 作用
info threads 列出所有線程
thread n 切換到指定的線程芬失,n是線程編號(hào)
set scheduler-locking on 只運(yùn)行當(dāng)前線程,鎖住其他線程
set scheduler-locking on step 單步執(zhí)行當(dāng)前線程時(shí)匾灶,鎖住其他線程
set scheduler-locking off 運(yùn)行當(dāng)前線程棱烂,同時(shí)運(yùn)行其他線程
handle SIG32 nostop 讓程序接收到sig32信號(hào)時(shí),不掛起

相關(guān)鏈接

GDB 常用法
GDB 調(diào)試Coredump問題
嵌入式開發(fā)中GDB調(diào)試Coredump問題
嵌入式開發(fā)中GDB串口遠(yuǎn)程調(diào)試
用backtrace()調(diào)試coredump問題
Valgrind memcheck 用法
Address Sanitizer 用法
Program received signal SIG32, Real-time event 32
SIG32 和 SIG33

參考資料

GDB Quick Reference
http://www.scott-webb.co.uk/misc/refcard.pdf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阶女,一起剝皮案震驚了整個(gè)濱河市垢啼,隨后出現(xiàn)的幾起案子窜锯,更是在濱河造成了極大的恐慌,老刑警劉巖芭析,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锚扎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馁启,警方通過查閱死者的電腦和手機(jī)驾孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惯疙,“玉大人翠勉,你說我怎么就攤上這事∶沟撸” “怎么了对碌?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒿偎。 經(jīng)常有香客問我朽们,道長(zhǎng),這世上最難降的妖魔是什么诉位? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任骑脱,我火速辦了婚禮,結(jié)果婚禮上苍糠,老公的妹妹穿的比我還像新娘叁丧。我一直安慰自己,他們只是感情好岳瞭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布拥娄。 她就那樣靜靜地躺著,像睡著了一般瞳筏。 火紅的嫁衣襯著肌膚如雪条舔。 梳的紋絲不亂的頭發(fā)上两嘴,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天赋铝,我揣著相機(jī)與錄音,去河邊找鬼诗眨。 笑死钻心,一個(gè)胖子當(dāng)著我的面吹牛凄硼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捷沸,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼摊沉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了痒给?” 一聲冷哼從身側(cè)響起说墨,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤骏全,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尼斧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜贡,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年棺棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楼咳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烛恤,死狀恐怖母怜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缚柏,我是刑警寧澤苹熏,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站币喧,受9級(jí)特大地震影響轨域,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粱锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扛邑。 院中可真熱鬧怜浅,春花似錦、人聲如沸蔬崩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沥阳。三九已至跨琳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桐罕,已是汗流浹背脉让。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留功炮,地道東北人溅潜。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薪伏,于是被迫代替她去往敵國(guó)和親滚澜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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