我為這個問題困擾了3天,現在解決了,我要把解決方法寫出來,避免各位再去無謂地google。
0x1 GDB printer python
這個東西估計很多人都聽說過。GDB 7.7已經支援了很多python接口,用這些接口可以實作很多gdb擴充。而GDB printer python就是用來把stl print得更加漂亮的。如果不用它,print指令會給你一堆你看不懂的東西,而用了它,它會把vector向數組那樣顯示出來,還會給出size和capacity,真是太好用了。
根據GDB官方的安裝指導頁面,好吧,我來翻譯一下:
首先你要把它從svn上checkout下來,
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
然後在 ~/.gdbinit 裡把這個東西填進去,啟用它,
python
import sys
sys.path.insert(0, '/home/maude/gdb_printers/python') #這個字元串裡的路徑要改成你自己svn下來的那個路徑
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
這樣就可以了。
可以了嗎?!!!
0x2 這樣做會報錯
如果你的系統跟我一樣,是 Ubuntu 14.10 LTS 的話,恭喜你,上述方法無效。
或許你會嘗試 libstdc++6-4.8-dbg這個包,但是我得到的結果是,它會抛出一個異常說你沒有 libstdcxx.v6.printers 這個子產品,這個問題已經在 debian 和ubuntu的 bug list裡了,貌似debian解決了,但是ubuntu還沒解決。
然後你或許會從/usr/share/gcc-4.8/裡把python檔案夾弄到你的目錄裡,然後試着用它,但是還是會抛出我下面寫的這個異常。
如果它的錯誤資訊如下,
File "<string>", line 3, in <module>
File "/home/james/gdb_printers/python/libstdcxx/v6/printers.py", line 54
raise ValueError, "Cannot find type %s::%s" % (str(orig), name)
^
SyntaxError: invalid syntax
那就是相容性問題,pretty printer python是用python2.7寫的,而Ubuntu把gdb的python連結到了python3裡,是以不相容,我試過各種patch,沒用,但是繼續看下面,會得到解決。
如果它 Throw 了一個 TypeError 異常,如下,
(gdb) p vct
Python Exception <class 'TypeError'> iter() returned non-iterator of type '_iterator':
$1 = std::vector of length 100, capacity 128
沒錯我遇到了同樣的問題,這是因為……我也不知道,如果你想弄懂,stackoverflow上的這個問題會給你答案,總之,這一切的解決方法都是從這個問題裡得到的,感謝那個回答者。
0x3 真正的解決方法
上面給出的那個stackoverflow頁面中的那個答案裡,給出了一個github位址,你隻要把它克隆下來,然後就可以用了。
git clone https://github.com/Manicqin/gdb_printers__python python
配置檔案不用改,就用上面那個就可以啦。
這實在是坑爹啊,希望各位被這個問題困擾的同學能夠搜到這篇文章……