本文已收錄至《Linux知識(shí)與編程》專欄!
作者:ARMCSKGT
演示環(huán)境:CentOS 7???
?
目錄
前言
正文
下載gdb
生成可調(diào)式文件
進(jìn)入gdb
gdb常用指令
查看代碼 l?
運(yùn)行程序 r?
斷點(diǎn)設(shè)置 b?
顯示信息 info?
查看斷點(diǎn) info b?
刪除斷點(diǎn)?d?
禁用斷點(diǎn) disable breakpoints?
啟用斷點(diǎn) enable breakpoints?
逐過程調(diào)試??n?
逐語句調(diào)試 s?
查詢變量 p?
查詢變量值常顯示 display?
取消變量常顯示 undisplay?
查詢變量類型 ptype?
修改變量值 set var?
逐斷點(diǎn)運(yùn)行 c?
執(zhí)行到當(dāng)前函數(shù)的return后停下 finish?
跳轉(zhuǎn)到指定代碼行 until?
查看調(diào)用堆棧 bt?
查詢當(dāng)前棧幀中各變量參數(shù) info locals?
退出gdb指令 quit?
部分指令的簡(jiǎn)寫和全稱
最后
前言
前面我們介紹了gcc/g++的使用,我們知道在VS平臺(tái)下編寫代碼是可以調(diào)試的,調(diào)試是我們經(jīng)常使用的糾錯(cuò)手段,在Linux平臺(tái)下也有相關(guān)的調(diào)試工具,那就是gdb,調(diào)試是我們必須掌握的技能,沒有調(diào)試項(xiàng)目的錯(cuò)誤就無法快速解決!
?
正文
下載gdb
有些純凈Linux系統(tǒng)默認(rèn)沒有g(shù)db,需要手動(dòng)安裝!
指令:
sudo yum -y install gdb
生成可調(diào)式文件
程序的發(fā)布方式有兩種,debug模式和release模式,Linux工具gcc/g++出來的二進(jìn)制程序默認(rèn)是release模式,要使用gdb調(diào)試,必須在源代碼生成二進(jìn)制程序的時(shí)候加上 -g 選項(xiàng)!
指令:
gcc -g [編譯文件] //g++操作與此相同
?
?
?
release模式的二進(jìn)制程序也可以進(jìn)入gdb,但是只能運(yùn)行,不能查詢?nèi)魏螀?shù)信息!
進(jìn)入gdb
指令:
gdb [可執(zhí)行程序]
gdb界面
gdb常用指令
在gdb中,輸入一個(gè)指令后,下次不輸入指令回車執(zhí)行的是上一條指令,所以調(diào)試時(shí)如果接下來將長(zhǎng)時(shí)間使用一條指令,則一直回車即可!
查看代碼 l?
l //查看第一行到第十行的代碼(第一次執(zhí)行時(shí)) l [行號(hào)] //查看程序從該行開始的前后五行代碼(如果前面沒有代碼則向后顯示十行) l [函數(shù)名] //顯示該函數(shù)位置的前后五行代碼(共十行)
說明:gdb在執(zhí)行l(wèi)指令后,再次回車會(huì)展示后十行代碼!
選擇行號(hào)1然后回車顯示后10行代碼,再次回車?yán)^續(xù)顯示! 如果選擇中間行,則會(huì)展示前后五行(共十行) gdb也可以顯示代碼中某函數(shù)的前后代碼(默認(rèn)也是前后五行)
運(yùn)行程序 r?
r //啟動(dòng)程序(有斷點(diǎn)則運(yùn)行到第一個(gè)斷點(diǎn)處停下,沒有則直接運(yùn)行到結(jié)束)
在gdb中r指令相當(dāng)于VS下的快捷鍵F5 ?說明:一般使用gdb都是先展示代碼,然后運(yùn)行程序,這樣可以對(duì)照代碼檢查運(yùn)行結(jié)果,在gdb中對(duì)于死循環(huán)的程序仍然可以使用CTRL+c退出程序,但不會(huì)退出gdb!
斷點(diǎn)設(shè)置 b?
b [行號(hào)] //在該行打下斷點(diǎn) b [函數(shù)名] //在該函數(shù)行打下斷點(diǎn)
?注意:對(duì)函數(shù)名打斷點(diǎn),斷點(diǎn)會(huì)落在該函數(shù)執(zhí)行的第一條語句!
顯示信息 info?
info [gdb指令] //部分指令可以通過info查看詳細(xì)信息 i [gdb指令] //簡(jiǎn)寫為i
info可以查看相關(guān)的指令信息,其中最常用的是breakpoints選項(xiàng)(簡(jiǎn)寫為b) ?說明:直接輸入info指令會(huì)顯示該指令的所有可操作選項(xiàng)!
查看斷點(diǎn) info b?
//查看所有斷點(diǎn)信息 info b //簡(jiǎn)寫 info breakpoints info break
在gdb中info b指令是經(jīng)常使用的查看斷點(diǎn)的指令,當(dāng)然info也不止于此!
通過info b查看斷點(diǎn)的詳細(xì)信息! 在斷點(diǎn)信息中我們會(huì)發(fā)現(xiàn)有Num一行編號(hào),這個(gè)編號(hào)是讓我們更好的對(duì)斷點(diǎn)進(jìn)行區(qū)分,當(dāng)我們刪除1號(hào)斷點(diǎn)再次添加斷點(diǎn)時(shí),新斷點(diǎn)為3號(hào),斷點(diǎn)順序并未修改!當(dāng)我們退出gdb時(shí)所有斷點(diǎn)信息才會(huì)失效!
??
而且這些編號(hào)在進(jìn)行關(guān)于斷點(diǎn)的其他操作時(shí),也會(huì)用到,例如刪除斷點(diǎn)需要這些編號(hào)指定!
刪除斷點(diǎn)?d?
d [斷點(diǎn)編號(hào)] //刪除該編號(hào)斷點(diǎn) d //刪除所有斷點(diǎn) d breakponits //刪除所有斷點(diǎn)
禁用斷點(diǎn) disable breakpoints?
disable breakpoints [斷點(diǎn)編號(hào)]
說明:有時(shí)候在進(jìn)行大項(xiàng)目測(cè)試時(shí),我們會(huì)打許多斷點(diǎn),我們不想讓程序運(yùn)行到某就停下斷點(diǎn),但是也不想刪除斷點(diǎn),這時(shí)可以禁用斷點(diǎn)!
當(dāng)斷點(diǎn)被禁用后,程序運(yùn)行到該行時(shí)就不會(huì)停下了!
啟用斷點(diǎn) enable breakpoints?
enable breakpoints [斷點(diǎn)編號(hào)]
說明:當(dāng)我們想使用被禁用的斷點(diǎn)時(shí),使用該指令可以啟用斷點(diǎn)!
逐過程調(diào)試??n?
n //從斷點(diǎn)處開始進(jìn)行逐過程調(diào)試
逐過程調(diào)試不會(huì)進(jìn)入函數(shù),直接返回函數(shù)執(zhí)行完的結(jié)果!
調(diào)試時(shí)執(zhí)行的函數(shù)代碼會(huì)顯示代碼行號(hào)!
逐語句調(diào)試 s?
s //從斷點(diǎn)處開始逐語句調(diào)試
逐語句調(diào)試會(huì)進(jìn)入函數(shù)中,將每一條語句運(yùn)行展示!
調(diào)試時(shí)的每一條語句都會(huì)顯示其所在代碼中的行號(hào)!
查詢變量 p?
p [變量] //查看變量值 p(變量) print [變量] print(變量)
查看變量的方式可以簡(jiǎn)寫,也可以通過括號(hào)將需要查詢的變量括起來!?
查詢變量值常顯示 display?
display [變量] //讓變量值隨查詢的運(yùn)行一直更新顯示
添加常顯示后,程序每走一步(或一句)都會(huì)顯示變量的常顯示變量的變化!?
當(dāng)變量常顯示后每執(zhí)行一條語句就會(huì)顯示變量 i 的變化情況 說明:常顯示中的變量前的編號(hào)與取消該變量的顯示操作相關(guān)!常顯示列表中的編號(hào)只會(huì)隨著添加越來越大,并不會(huì)一直以1為開始!
取消變量常顯示 undisplay?
undisplay [常顯示列表編號(hào)] //取消變量在列表中的常顯示
說明:取消常顯示并不是指定變量,而是指定其在常顯示中的編號(hào)!因?yàn)樵贑++中,不同類和不同遇可能有相同的變量,此時(shí)會(huì)混淆!
查詢變量類型 ptype?
ptype [變量]
因?yàn)槲覀儾樵冏兞恐禃r(shí)只能獲取變量的值,如果需要獲取變量的類型則可以使用這個(gè)指令!
修改變量值 set var?
set var [變量] = [設(shè)置的值]
在程序運(yùn)行時(shí)可能我們想一次性迭代到某數(shù)值,使用set var就能完成!
逐斷點(diǎn)運(yùn)行 c?
c //逐斷點(diǎn)按順序跳轉(zhuǎn)執(zhí)行
當(dāng)我們想在斷點(diǎn)之間運(yùn)行時(shí),直接使用該指令即可,相當(dāng)于VS的F5快捷鍵!
在執(zhí)行該gdb指令前需要r指令讓程序運(yùn)行!
執(zhí)行到當(dāng)前函數(shù)的return后停下 finish?
finish //讓程序執(zhí)行return語句后停下
指令要求:必須在有返回值的函數(shù)中運(yùn)行且必須讓程序先運(yùn)行起來!
跳轉(zhuǎn)到指定代碼行 until?
until [代碼行號(hào)] //讓執(zhí)行位置跳轉(zhuǎn)到指定行
當(dāng)我們想要去某一條語句查看運(yùn)行情況時(shí)可以使用此指令跳轉(zhuǎn)!
說明:如果前面有未執(zhí)行的代碼該指令會(huì)運(yùn)行到指定代碼行號(hào)然后停下,如果是跳轉(zhuǎn)到執(zhí)行過的代碼,則會(huì)從該行開始繼續(xù)執(zhí)行!
查看調(diào)用堆棧 bt?
bt //查看函數(shù)調(diào)用,以棧的順序顯示
當(dāng)我們需要查看函數(shù)相互之間的調(diào)用時(shí)可以使用該指令!該指令需要先運(yùn)行程序才能查看,因?yàn)槌绦蜻\(yùn)行時(shí)會(huì)先為函數(shù)建立棧幀,沒有運(yùn)行程序就沒有棧幀!
查詢當(dāng)前棧幀中各變量參數(shù) info locals?
info locals
當(dāng)我們正在某一函數(shù)中調(diào)試時(shí),通過該指令可以查看該函數(shù)中所有變量的值!
退出gdb指令 quit?
quit //或使用 CTRL+d 也可以! q //也可以使用簡(jiǎn)寫形式
退出gdb只需要輸入q(quit)即可,或者使用快捷鍵CTRL+d,如果有程序正在調(diào)試沒有退出,則gdb會(huì)先詢問!
部分指令的簡(jiǎn)寫和全稱
l | list |
r | run |
n |
next |
s | step |
b | break |
i b | info break |
f | finish |
p | |
c | continue |
d | delete breakpoints |
u | until |
bt? | breaktrace |
q | quit |
最后
Linux調(diào)試器gdb的介紹到這里就結(jié)束了,相信gdb的學(xué)習(xí)可以助力你在Linux相同上更順利的構(gòu)建大型工程,從容的面對(duì)各種bug,雖然在使用上與VS還有些差異,但是配合Linux上的其他工具一定可以使效率有一定的提升!
本次Linux調(diào)試器gdb的基本知識(shí)就介紹到這里啦,希望能夠盡可能幫助到大家。
如果文章中有瑕疵,還請(qǐng)各位大佬細(xì)心點(diǎn)評(píng)和留言,我將立即修補(bǔ)錯(cuò)誤,謝謝!
???其他文章閱讀推薦??
Linux編輯器vim-CSDN博客
Linux 編譯器 gcc/g++-CSDN博客
Linux項(xiàng)目自動(dòng)化構(gòu)建工具make/Makefile-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-624333.html
??歡迎讀者多多瀏覽多多支持!??文章來源地址http://www.zghlxwxcb.cn/news/detail-624333.html
到了這里,關(guān)于Linux調(diào)試器gdb的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!