1. 程式人生 > >gdb除錯工具使用(1)

gdb除錯工具使用(1)

今天開始學習在linux下面進行c++程式碼的除錯方法的學習。使用GDB除錯c++程式碼是unix環境c++程式設計的基本技能。對於長期在windows平臺下面從事c++程式設計的程式設計師來說,在linux環境下面進行gdb除錯確實有點難為人,但是gdb本身是一個功能強大的程式碼除錯工具,只要多使用,熟悉了基本的命令使用方法和windows平臺下IDE的除錯相關功能有個很好的影射,那麼在linux下面進行c++開發能力又將前進一大步。本文是我學習gdb除錯工具的第一篇,先記錄一些基本的gdb工具命令的使用,例如在gdb中檢視原始碼,執行程式,設定斷點,檢視變數值等等。後續還要學習多執行緒等條件下的除錯技術,慢慢來,先從基礎的開始。

前提

如果要使用gdb除錯程式,在編譯程式時需要加上-g選項,才能使用gdb工具除錯。g++有關除錯的選項有-g,-gstab,-gstab+,-ggdb,-glevel等,主要的作用就是告訴編譯器在編譯的時候儘量能生成除錯資訊,以便偵錯程式獲取除錯資訊。我們常用-g選項。此外,如果不加-g引數,當程式core掉時,使用gdb檢視core檔案是看不到core在哪一行程式碼的,只能知道core在那個函式呼叫,定位到函式。這也說明沒加-g選項,缺少一些除錯資訊。在開發測試過程中,編譯的時候加-g選項是一個不錯的習慣,以便查詢問題。關於core的問題例項看如下圖: 下圖是使用了-g選項編譯的程式core掉後的gbd檢視core的結果,現實哪一行出現的core

下圖是沒有使用-g選項編譯的情況,當程式出現core,只能定位到函式:

常用的基本命令

當編譯生成二進位制檔案以後,我們就可以使用gdb命令除錯該程式了,使用如下命令啟動除錯:
gdb path/to/program
將出現如下提示:
輸入命令l(list),將會列出程式的程式碼清單:(繼續輸入回車將會繼續執行上次的命令(l命令)繼續往下顯示程式碼)
使用b(break)+程式碼行號 來設定斷點。
使用r命令開始執行程式:(本程式為剛剛那個core的程式,直接結束了)

我們現在將斷點設定到27行的core_foo()處,這樣程式執行到該處時將停止,此時我們可以使用p命令檢視變數的值:


whatis命令檢視變數的型別

複雜結構變數的檢視

在寫程式的時候,變數的型別往往是比較複雜的型別,比如說stl的容器類,結構體,物件等等,gdb的p命令當然也支援這類變數的檢視,但是使用起來有點不太方便,檢視起來比較麻煩。例如:

上圖中vec是一個vector<int>型別的變數,使用gdb的p命令顯示不能直觀的看到vec的元素的值。http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt提供了在gdb中整合輸出容器類的內容的命令,包括有pmap,pvector,plist等等。只需要將該檔案中的程式碼拷貝進~/.gdbinit檔案中即可,沒有這個檔案就新建一個,重新進入gdb就有了這些功能。下圖為使用pvector顯示的vector的內容:
同樣,我們可以使用pmap檢視map變數的內容,下圖是檢視map<string, int>型別變數的值的方法:(直接輸入pmap命令會有使用方法提示,注意這裡string使用char*代替才行,問題:如果string變成其他的自定義類呢?這種情況在自己試試應該怎麼檢視,應該和結構體的使用是類似的,直接使用宣告的類名就行吧,猜測一下)
下面是list容器加結構體變數元素的變數檢視:list的每個元素是一個結構體

今天就記錄這些吧,接下來在學習一下更為複雜的除錯場景的gdb使用。 一天學一點,每天進步一點^-^