說在前面:
gdb所有的指令都可以使用簡寫來執(zhí)行晌畅,比方說:continue 可以使用c 來表示
linux里面最終要的鍵但指,我覺得是TAB鍵。在gdb里面記得多按按抗楔,也許你就會(huì)發(fā)現(xiàn)不一樣的天地棋凳。
如果你編寫的程序需要能被gdb識(shí)別到,則需要添加-ggdb -g 【可供gdb識(shí)別到】 -O0 【不開啟優(yōu)化】
學(xué)習(xí)一個(gè)新命令的時(shí)候连躏,多使用 --help 進(jìn)行查看
使用gdb的場景:
- linux進(jìn)行斷點(diǎn)調(diào)試
- 查看段錯(cuò)誤
- 查看當(dāng)前進(jìn)程的相關(guān)線程
- 配合ulimit使用 【這個(gè)也可以弄一篇文章】
- ... [你還想得起哪些場景呢剩岳?]
- android設(shè)備端的gdb【下篇講】
如何使用gdb
有些設(shè)備需要自己編譯gdb,再安裝gdb入热。
請(qǐng)進(jìn)入 官網(wǎng) ,進(jìn)行下載拍棕。
這里需要說明下他會(huì)關(guān)聯(lián)termcap 如果沒有要在下載這個(gè)包的源碼進(jìn)行編譯
gdb相關(guān)的指令
指令 | 含義 | 例子 |
---|---|---|
gdb + 某一個(gè)應(yīng)用 | gdb的方式啟動(dòng)某一個(gè)應(yīng)用 | gdb test |
gdb + 某一個(gè)應(yīng)用+ 某一個(gè)進(jìn)程 | 掛載到某一個(gè)已經(jīng)運(yùn)行的引用 | gdb test 1234 |
gdb模式下:
開始
指令 | 含義 | 例子 |
---|---|---|
c | 繼續(xù)執(zhí)行,從暫停狀態(tài)變成運(yùn)行狀態(tài) | |
r | 重新開始 | |
q | 停止 | |
info threads | 顯示出當(dāng)前的線程列表 | |
r 參數(shù)列表 | 攜帶參數(shù)的方式重新運(yùn)行 | r 1 2 3 |
斷點(diǎn)
設(shè)置斷點(diǎn)
指令 | 含義 | 例子 |
---|---|---|
b + 方法名 | 為方法設(shè)置斷點(diǎn) | b testA |
b + 文件 | 在某一個(gè)文件的某一行打上斷點(diǎn) | b a.c |
b + 文件 : 方法名 | 在某一個(gè)文件的某一方法打上斷點(diǎn), | b a.c:testA |
b + 設(shè)置 + if + expression | 條件成功的時(shí)候才設(shè)置斷點(diǎn) | b testA if a>0 |
取消斷點(diǎn)
指令 | 含義 | 例子 |
---|---|---|
info breakpoints | 查看當(dāng)前的斷點(diǎn)信息 | |
delete [n] | n 表示斷點(diǎn)NUM 勺良,如果沒有n 和clear的作用相似 | delete 1 |
clear | 清楚所有的斷點(diǎn) | |
disable | 不啟用某個(gè)斷點(diǎn) | disable 1 |
enable | 啟用某個(gè)斷點(diǎn) | enable 1 |
執(zhí)行
指令 | 含義 | 例子 |
---|---|---|
n | 單步不進(jìn)入,相當(dāng)于 step over | |
s | 單步進(jìn)入 绰播,相當(dāng)于 step into | |
finish | 退出函數(shù),相當(dāng)于step out | |
c | 繼續(xù)執(zhí)行尚困,相當(dāng)于 Resume Program |
斷點(diǎn)_AS_IDE.png
查看
指令 | 含義 | 例子 |
---|---|---|
bt | 在任何停止?fàn)顟B(tài)下蠢箩,都可以打印出堆棧信息 | |
f + 棧號(hào) | 進(jìn)入到具體某一個(gè)堆棧里面的方法,此時(shí)就可以打印出相關(guān)的函數(shù)內(nèi)部的值了事甜,棧號(hào)通過bt查看 | f 2 |
p + 變量 | 打印出當(dāng)前的變量的值 | p a |
回車 | 重復(fù)執(zhí)行上一條指令 |
實(shí)例
查看哪些位置創(chuàng)建了線程
gdb test # gdb執(zhí)行test
b pthread_create #將創(chuàng)建線程的函數(shù)打上日志
r #運(yùn)行
...[卡住]
bt # 查看當(dāng)前的堆棧信息谬泌,
info threads # 查看當(dāng)前進(jìn)程的線程
c # 繼續(xù)運(yùn)行
查看crash的位置在哪里
gdb test # gdb執(zhí)行test
r
... [fatal error]
bt # 查看當(dāng)前的堆棧信息,
f 2 # 跳轉(zhuǎn)到具體的一個(gè)方法里面
p a # 查看在方法堆棧2里面a的值
問答
為啥逻谦,我用gdb的時(shí)候出現(xiàn)了 ??? 呢呵萨?
請(qǐng)確保你自己編譯的庫已經(jīng)打開了-g -ggdb -O0,
有些第三方庫跨跨,是不開啟這個(gè)選項(xiàng)的潮峦,所以如果gdb打印的堆棧到了那些庫里面,就會(huì)出現(xiàn)???勇婴,比方說qt相關(guān)的庫