我已经使用http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_inspect_the_contents_of_STL_containers.3F配置了 pretty-print 。它可以成功地用于 vector 容器和其他容器。但是我不能像下面的例子那样检查 map :

#include <map>
#include <iostream>

using namespace std;

int main ()
{
map <int, string> mapIntToString;
map <int, int> mapInt2;
 mapIntToString.insert (map <int, string>::value_type (3, "Three"));
 mapInt2.insert (map <int, int>::value_type (3, 4));
 return 0;
}

使用gdb打印时出现以下错误:
(gdb) p mapInt2
$1 = std::map with 1 elementsTraceback (most recent call last):
File "/home/myuser/opt/gdb_printers/python/libstdcxx/v6/printers.py", line 422, in    children
rep_type = find_type(self.val.type, '_Rep_type')
File "/home/myuser/opt/gdb_printers/python/libstdcxx/v6/printers.py", line 45, in    find_type
 raise ValueError, "Cannot find type %s::%s" % (str(orig), name)
ValueError: Cannot find type std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::_Rep_type

最佳答案

您使用什么编译器(和哪个版本)来构建测试源?

我猜这不是g++的最新版本。这是我用g++ 4.4.3-4ubuntu5得到的:

$ gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) b 12
Breakpoint 1 at 0x400de3: file t.cc, line 12.
(gdb) r

Breakpoint 1, main () at t.cc:12
12   return 0;
(gdb) p mapInt2
$1 = std::map with 1 elements = {[3] = 4}

更新:



我看到了问题。您引用的说明是不正确的

特别地,这些指令建议:svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python,但是问题是python代码进入了libstdc++内部,因此必须与这些内部匹配(这就是 pretty-print 属于GCC而不是GDB的一部分的原因,这是事实。标语提示)。

当您执行新的svn co ...时,您获取了一个与libstdc++内部不再匹配的python代码拷贝,这就是导致您遇到问题的原因。

特别地,svn log显示在此处添加了find_type:
r183732 | tromey | 2012-01-30 08:25:11 -0800 (Mon, 30 Jan 2012) | 27 lines

那比gcc-4.4.3晚得多。然后,您要做的就是获得与您的libstdc++版本相匹配的 pretty-print ,如下所示:
svn co svn://gcc.gnu.org/svn/gcc/branches/gcc_4_4_3_release/libstdc++-v3/python

除非上述命令不起作用,因为gcc 4.4.3早于 pretty-print 。

没关系,在4.4.3和4.6之间,std::map的实现(以及STL内部的大部分其余部分)没有改变,并且此命令确实起作用:
 svn co svn://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch/libstdc++-v3/python

关于c++ - pretty-print 打印机会抛出类型错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9102967/

10-12 18:51