一、GDB概述
Linux下的GDB調(diào)試器,是一款GNU組織開(kāi)發(fā)的UNIX/Linux下的程序調(diào)試工具,它沒(méi)有圖形化的友好界面,但功能強(qiáng)大。
二、準(zhǔn)備工作
(a) 安裝GDB: apt install gdb
(b) 創(chuàng)建main.cpp文件
vim使用技巧:在按esc進(jìn)入命令模式下,在!后可直接輸入命令行進(jìn)行執(zhí)行,還可以進(jìn)行上下鍵查看歷史命令。這樣可以在不退出vim的情況下進(jìn)行編譯,從而及早發(fā)現(xiàn)問(wèn)題。
三、GDB常用命令及調(diào)試實(shí)例
由于調(diào)試程序是個(gè)極為頻繁的操作linux常用命令,所以GDB的所有命令,只要不出現(xiàn)沖突linux常用命令,都可以進(jìn)行簡(jiǎn)寫(xiě),如list可直接簡(jiǎn)寫(xiě)為l,break可直接簡(jiǎn)寫(xiě)為b。
為了方便調(diào)試,修改main.cpp如下:
(1) 編譯成debug版
1.在ide工程選項(xiàng)里面配置release版本也生成調(diào)試信息,發(fā)布時(shí),將pdb文件和exe文件一起發(fā)布。? 在vs中我們選擇“菜單”-》工具-》選項(xiàng),選項(xiàng)窗口中選擇調(diào)試-》符號(hào)。galaxys3已經(jīng)啟動(dòng)開(kāi)發(fā)者選項(xiàng),但是連接電腦之后手機(jī)提示連接為媒體設(shè)備,怎么進(jìn)行usb調(diào)試and...……galaxys3已經(jīng)啟動(dòng)開(kāi)發(fā)者選項(xiàng),但是連接電腦之后手機(jī)提示連接為媒體設(shè)備,怎么進(jìn)行usb調(diào)試and...。
(2) 使用GDB對(duì)debug版本的可執(zhí)行文件進(jìn)行調(diào)試
執(zhí)行 gdb main
【查看代碼】
定位到crash函數(shù),上文第一個(gè)紅色行,然后根據(jù)偏移行定位到第三個(gè)紅色行,向上查看定位到第二個(gè)紅色行,最后定位到異常代碼出現(xiàn)在gtg.cpp的第五行,哈哈一個(gè)簡(jiǎn)單的異常定位就結(jié)束了。內(nèi)聯(lián)函數(shù)應(yīng)該是語(yǔ)句比較少、結(jié)構(gòu)比較簡(jiǎn)單的函數(shù),不應(yīng)該是復(fù)雜的函數(shù),因?yàn)樗鼘?duì)編譯器來(lái)說(shuō)就是代碼,如果很復(fù)雜會(huì)造成代碼膨脹,反而增大開(kāi)銷,這種情況下其實(shí)多數(shù)編譯器就都會(huì)自動(dòng)把它作為普通函數(shù)來(lái)處理了。當(dāng)應(yīng)用程序運(yùn)行時(shí),windows會(huì)自動(dòng)調(diào)用應(yīng)用程序框架內(nèi)部的winmain函數(shù),并自動(dòng)查找該應(yīng)用程序類的全局變量theapp,然后自動(dòng)調(diào)用用戶應(yīng)用程序類的虛函數(shù)initinstance,該函數(shù)會(huì)進(jìn)一步調(diào)用相應(yīng)的函數(shù)來(lái)完成主窗口的構(gòu)造和顯示工作,如一個(gè)單文檔應(yīng)用程序的應(yīng)用程序文件中的程序名.cpp中的initinstance()函數(shù)中的代碼:。
【控制程序運(yùn)行】
(2) break 行號(hào) | 函數(shù)名<條件表達(dá)式> 設(shè)置斷點(diǎn)
使用info break ,查看斷點(diǎn)信息:
使用 delete (Num) ,刪除斷點(diǎn):
(3) run 運(yùn)行函數(shù)到斷點(diǎn)處或者程序結(jié)束
(4) next 單步運(yùn)行一條指令,不進(jìn)入函數(shù)(把整個(gè)函數(shù)當(dāng)成一行命令執(zhí)行)
(5) step 單步運(yùn)行一條指令,進(jìn)入函數(shù)(真正的單條語(yǔ)句運(yùn)行)
(6) continue 繼續(xù)執(zhí)行,直到遇到新斷點(diǎn)或者程序結(jié)束
(7) watch 變量|表達(dá)式 觀察變量或者表達(dá)式的值,只要其發(fā)生變化,則停止。
這個(gè)例子不是上述代碼,反正比較簡(jiǎn)單,就是定義個(gè) int i =0; 然后 i++;
【打印和設(shè)置內(nèi)存變量】
為測(cè)試方便,修改代碼如下:
(8) print 變量|表達(dá)式 查看當(dāng)前指定變量或表達(dá)式的值
(9) set 變量名=新值 設(shè)置內(nèi)存中指定變量的值,若出現(xiàn)不明確,需要加上var指明是程序中的變量
【查看程序調(diào)用!
為方便測(cè)試,修改main.cpp如下:
(10) backtrace當(dāng)程序宕掉時(shí),查看程序調(diào)用棧
所以說(shuō)GDB是在Linux編程中必須使用的工具,沒(méi)有GDB,在出現(xiàn)錯(cuò)誤的時(shí)候很難想象錯(cuò)誤發(fā)生在哪里。另外在Linux中也有這樣的好處,就是當(dāng)程序宕掉了基本不會(huì)對(duì)系統(tǒng)造成影響,而在windows中程序宕掉甚至?xí)瓜到y(tǒng)產(chǎn)生異常,所以Linux是比較穩(wěn)定可靠的,適合做服務(wù)器。
段錯(cuò)誤調(diào)試:使用Core Dump查找程序宕掉的原因,可參考如下博客,講得很詳細(xì):
https://www.cnblogs.com/lidabo/p/5014710.html