gdb漂亮的打印不一致

时间:2015-12-02 12:11:15

标签: python c++ gdb pretty-print

我试图找出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类型变量:

  1. c_value_print() @ c-valprint.c:459调用简单指针打印,并打印类型

  2. c_val_print() @ c-valprint.c:134,这是从漂亮的打印机的子打印中调用的。这个不打印指针类型

  3. 由于那里有重复的代码,这看起来像可能在此代码库中累积的补丁工作。

    这非常令人失望。我建议进行更改,但是这个工具在很多环境中使用,我无法测试更改。

0 个答案:

没有答案