天天看點

用gdb調C++标準庫

我一直都是在linux下做開發的,但是我對gdb的使用并不多。因為平都是用qtcreator調試程式的。因為工作的原因,以後可能不能再依賴qtcreator了。于是我好好研究一下~

之前為什麼沒有深入使用gdb,qtcreator帶來一定的便利是一方面,另一方面是覺得gdb遇到了vector, map, set, list就沒辦法看資料了。

今天我研究了一下,其實也是easy的。

示例代碼:

編譯的時候:

在gdb調試中,可以用print指令檢視變量或常量的值。

可能是我本機所安裝的gdb版本較高的緣故,本機的gdb本謝就很支援stl中的容器。如下是我gdb的版本資訊:

對stl容器的支援是極好的:

能看到這樣的資訊其實已經很不錯了。

但是我公司系統的gdb可沒這麼智能。列印一下vector,就會蹦出好大堆資訊。如果是map的話,那就更吓人了。

<此處展示可怕的提示資訊>

其實,在這大堆資訊裡面隻有小部分是我們關注的。gdb很靈活,我們可以在裡面自定義函數。我可以在gdb裡定義一個函數從vector裡提取重要的資訊進行顯示。

将這個檔案下載下傳到home目錄,然後:

這樣,每次啟動 gdb的時候,都會自動加載 ~/.gdbinit 檔案中的内容。

輸入了p之後,每次連續按兩次tab鍵都會列出以p開頭的指令。這裡我們看到了:pstring, pvector, pwstring, pstack, pmap, pmap_member等等。

我們用一下pvector來檢視vstr中的内容:

這個指令果然列印出了很多有價值的資訊。

部落客有個習慣,我不僅要知其然,我還要知其是以然。于是我研究了一下 .gdbinit檔案裡的内容。這個函數都是在 ~/.gdbinit 裡定義的。我們打開這個檔案看一下。

看全部有點多,我們暫且不看多個參數的那部分,我們分析一下隻有一個參數的一部分:

所有的說明都寫在上面的注釋中了,自己去悟吧!

如果print指令能像c++裡的模闆函數那可以對特定類型進行“偏特化”就好了。上面是有個問題的:

在“p *($arg0._m_impl._m_start + $i)”這行指令中,如果vector的成員還是個stl的容器該怎麼辦?這是個問題~