漂亮的打印不适用于c ++ stl列表

时间:2017-03-20 05:05:31

标签: c++ stl gdb pretty-print

在将gdb用于以下代码时,看起来漂亮的打印工作正如预期的stl向量和字符串,但列表的输出看起来很神秘。

   list<int> l;
   string a = "Hello";
   vector<int> v(2,3);
   l.push_back(5);
   l.push_back(10);

gdb pretty print的输出:

(gdb) set print pretty on
(gdb) disp v
1: v = std::vector of length 2, capacity 2 = {3, 3}
(gdb) disp a
2: a = "Hello"
(gdb) disp l
3: l = {
  <std::__cxx11::_List_base<int, std::allocator<int> >> = {
    _M_impl = {
      <std::allocator<std::_List_node<int> >> = {
        <__gnu_cxx::new_allocator<std::_List_node<int> >> = {<No data fields>}, <No data fields>}, 
      members of std::__cxx11::_List_base<int, std::allocator<int> >::_List_impl: 
      _M_node = {
        <std::__detail::_List_node_base> = {
          _M_next = 0x615c40, 
          _M_prev = 0x615c60
        }, 
        members of std::_List_node<unsigned long>: 
        _M_data = 2
      }
    }
  }, <No data fields>}

有人可以指出我做错了吗?

UPD1:我在x86-64上使用以下版本的gcc和gdb以及Ubuntu 16.04

gcc 5.4.1
gdb 7.11.1

我尝试使用gcc 6.2.0,但同样的问题仍然存在......

UPD2:看起来列表的漂亮打印机已启用(旁边没有[已禁用])

(gdb) info pretty-printer 
global pretty-printers:
  builtin
    mpx_bound128
  objfile /usr/lib/x86_64-linux-gnu/libstdc++.so.6 pretty-printers:
  libstdc++-v6
    __gnu_cxx::_Slist_iterator
    __gnu_cxx::__7::_Slist_iterator
    ..
    ..
    std::__7::forward_list
    std::__7::list
    std::__7::map

1 个答案:

答案 0 :(得分:1)

很好地打印出数据结构是extends GDB的一些Python代码的函数(没有双关语)。 GDB manual上有一段pretty printing in GDB

事实证明,对于共享库(也可能对于静态链接的库,它并不完全清楚)GDB has a way to automatically load them。在我的Fedora 25系统上,GDB自动加载/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.22-gdb.py并且此文件加载了libstdc++漂亮的打印机。

在线手册中有一个pretty extensive section on writing your own GDB pretty printer的Python。

为了解决您遇到的具体问题,对于libstdc++漂亮的打印机,有些事情必须相当混乱,因为::std::vector的打印机似乎已打开并正常工作对于::std::list没有。也许这正是发生的事情。不知怎的,::std::list的一个被取消注册或关闭。 section on how GDB selects a pretty printer表示可以单独启用或禁用它们,以便处理非工作的。