我试图找出gdb漂亮打印中的不一致。 考虑以下简短程序:
#include <map>
int main(int argc, char* argv[])
{
int i=5;
int* p=&i;
std::map<int,int*> m;
m[3]=p;
return 0;
}
如果我在return 0;
行放置断点并打印指针,我会得到:
(gdb) print p
$1 = (int *) 0xbffff12c
如果我打印地图的内容,我会得到:
(gdb) print m
$2 = std::map with 1 elements = {[3] = 0xbffff12c}
请注意,现在已剥离指针类型信息。显然,使用简单的地图类型并不是真正的问题,但在具有嵌套数据结构的大型程序中,没有这些信息是一个问题。
我觉得这很奇怪的原因是,我会假设嵌套对象使用各自的漂亮打印机打印,这应该产生类型信息,就像我直接打印指针一样。
我尝试查看STL漂亮的打印python代码,但无法弄清楚如何解决这个问题。我可以看到std :: map打印机迭代器返回从RB树中查询的对象,但那里没有进行格式化。
我将非常感谢任何帮助,其形式包括python打印机代码中需要进行哪些更改,代码中可能进行更改的位置或任何其他线索。
我调查了gdb代码,似乎有两个单独的函数可以打印本机C类型变量:
c_value_print()
@ c-valprint.c:459
调用简单指针打印,并打印类型
c_val_print()
@ c-valprint.c:134
,这是从漂亮的打印机的子打印中调用的。这个不打印指针类型
由于那里有重复的代码,这看起来像可能在此代码库中累积的补丁工作。
这非常令人失望。我建议进行更改,但是这个工具在很多环境中使用,我无法测试更改。