pretty print not working for c++ stl list

跟風遠走 提交于 2021-01-27 12:24:56

问题


While using gdb for the following code, it appears that pretty print works as expected for stl vector and strings but the output for list seems cryptic.

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

Output of 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>}

Can someone please point out what I am doing wrong?

UPD1: I am using the following versions of gcc and gdb with Ubuntu 16.04 on x86-64

gcc 5.4.1
gdb 7.11.1

I tried using gcc 6.2.0, but the same problem remains ...

UPD2: It appears that the pretty printer for list is enabled (does not have [disabled] next to it)

(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:


Printing out the data structures nicely is a function (no pun intended) of some Python code that extends GDB. There is a section of the GDB manual on pretty printing in GDB.

It turns out that for shared libraries (and possibly for statically linked libraries too, it's not completely clear) that GDB has a way to automatically load them. On my Fedora 25 system GDB autoloads /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.22-gdb.py and this file loads up the libstdc++ pretty printers.

The online manual has a pretty extensive section on writing your own GDB pretty printer in Python.

For you to be having the specific problem you're having, something must be fairly messed up about the libstdc++ pretty printers since the one for ::std::vector appears to be turned on and working and the one for ::std::list does not. Perhaps that's exactly what happened. Somehow the one for ::std::list was de-registered or turned off. The section on how GDB selects a pretty printer says that it's possible to enable or disable them on an individual basis in order to deal with non-working ones.



来源:https://stackoverflow.com/questions/42896196/pretty-print-not-working-for-c-stl-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!