2012-07-23 202 views
38

我按照說明on the GDB wiki安裝了用於查看STL容器的python漂亮打印機。我~/.gdbinit現在看起來是這樣的:如何在GDB中漂亮地打印STL容器?

python 
import sys 
sys.path.insert(0, '/opt/gdb_prettyprint/python') 
from libstdcxx.v6.printers import register_libstdcxx_printers 
register_libstdcxx_printers (None) 
end 

然而,當我運行GDB並嘗試打印STL類型,我得到如下:

print myString 
Python Exception <class 'gdb.error'> No type named std::basic_string<char>::_Rep.: 
$3 = 

任何人都可以闡明這一些輕?我運行的是Ubuntu 12.04,它帶有GDB 7.4。

+5

它可能只是因爲C++庫已經改變了它的內部類型和成員變量,而且Python模塊還沒有跟上。 – 2012-07-23 07:21:32

+0

你能否粘貼更多的信息,比如C++源代碼,編譯選項等?我只是在Ubuntu 12.04上測試了它,它適用於我。 – user1202136 2012-08-14 15:53:55

+0

Fedora 17適合我。 – Omnifarious 2012-10-17 18:22:31

回答

1

我認爲你使用的是非GNU STL庫,或者可能是一個非常古老的GCC libstdc++。我的編譯器上的正常STL字符串的類型是:std::basic_string<char, std::char_traits<char>, std::allocator<char> >。請注意,這不是std::basic_string<char>

的Python代碼有這個在它:

reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer() 

此查找嵌套類型::Rep什麼的基本字符串類型實際上是。該錯誤消息表明,您正在使用的任何奇怪庫的字符串類實際上並沒有::Rep嵌套類型。

7

你可以用下面GDB宏(其附加到你的〜/ .gdbinit文件)打印STL containter類型的數據,甚至它們的數據成員嘗試:https://gist.github.com/3978082

2

如果Python的後鍵入info type _Rep例外情況,gdb會通知你加載的匹配_Rep的類。該列表可以幫助您找到爲什麼python找不到您的std::string class

我剛剛面臨你的問題,在我的情況是英特爾C編譯器,ICC,誰打破漂亮的打印。特別是,對於std::string結果不合格的ICC名稱:

std::basic_string<char, std::char_traits<char>, std::allocator<char> >::std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep; 

,但相當打印機一直在尋找不合格GCC名稱:

std::basic_string<char, std::char_traits<char>, std::allocator<char>::_Rep; 

我做了什麼,以解決我的問題是在printers.py修改StdStringPrinter類,將字符串的非限定名稱添加到類型名以查找gdb。從info type

reptype = gdb.lookup_type (str (realtype) + '::' + str (realtype) + '::_Rep').pointer() 

使用所得到的列表中,您可以治好你的漂亮的打印機,以使他們的工作:更換行:

reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer() 

與此有關。

0

我遇到了這個問題,並試圖弄清楚這個問題。我最終修復了它,我認爲這是值得分享我的經驗。

我使用的是gcc-5.2,所以我從svn repo下載了美圖打印機的gcc-5分支版本。但是,我不得不做這兩個器官功能障礙綜合徵:

1)編輯.gitinit文件時,建議除了是

python 
import sys 
sys.path.insert(0, '/home/bartgol/.gdb/gdb_printers/python') 
from libstdcxx.v6.printers import register_libstdcxx_printers 
register_libstdcxx_printers (None) 
end 

但是,我不得不作出評論線register_libstdcxx_printers (None),因爲我一直得到一個錯誤告訴我libstdcxx_printers已經註冊。顯然他們在導入階段註冊。

2)我必須編輯std::setstd::map的printers.py文件。由於_Rep_type這兩種類型都是私有的。具體來說,我用svn repo上gcc-4_6分支版本的漂亮打印機版本中的相應版本替換std::mapstd::set中的例程children。從此以後沒有錯誤,現在打印出來的東西很好。

希望這會有所幫助。

0

這只是工作在Ubuntu 17.04

Debian的似乎終於集成事情妥善現在:

#include <map> 
#include <utility> 
#include <vector> 

int main() { 
    std::vector<int> v; 
    v.push_back(0); 
    v.push_back(1); 
    v.push_back(2); 
    std::map<int,int> m; 
    m.insert(std::make_pair(0, 0)); 
    m.insert(std::make_pair(1, -1)); 
    m.insert(std::make_pair(2, -2)); 
} 

編譯:

g++ -O0 -ggdb3 -o container.out -std=c++98 container.cpp 

結果:

(gdb) p v 
$1 = std::vector of length 3, capacity 4 = {0, 1, 2} 
(gdb) p m 
$2 = std::map with 3 elements = {[0] = 0, [1] = -1, [2] = -2} 

我們可以看到漂亮的打印機安裝有:

info pretty-printer 

其中包含了行:

global pretty-printers: 
    objfile /usr/lib/x86_64-linux-gnu/libstdc++.so.6 pretty-printers: 
    libstdc++-v6 
    std::map 
    std::vector 

打印機按照文件provieded:

附帶
/usr/share/gcc-7/python/libstdcxx/v6/printers.py 

主C++庫包libstdc++6,位於GCC源代碼中的libstdc++-v3/python/libstdcxx下:https://github.com/gcc-mirror/gcc/blob/gcc-6_3_0-release/libstdc%2B%2B-v3/python/libstdcxx/v6/printers.py#L244

TODO:GDB如何發現該文件是最終的神祕莫測,它不在我的Python路徑中:python -c "import sys; print('\n'.join(sys.path))"因此它必須在某處硬編碼?

0

上面發佈的錯誤通常在程序是LLVM-build(由clang編譯)時出現,並且您嘗試通過gdb(它應該用於GCC-build程序)進行調試。 理論上,LLVM-build程序可能會被調試gdb,反之亦然。但是 爲了避免上面發佈的問題,如果您使用clang,則應該使用lldb,如果使用g++,則應該使用gdb