为什么Eclipse不使用GDB的漂亮打印?

时间:2015-04-20 04:35:41

标签: c++ eclipse debugging gdb

我在Ubuntu 14.04和GDB 7.7.1上使用Eclipse 4.4.2。我试图检查Eclipse调试器中的一些C ++标准库容器的内容。

到目前为止我尝试过:按照说明here,我运行了命令

svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

将其复制到/home/myusername/prettyprint

然后我将此文本复制到我的.gdbinit:

python
import sys
sys.path.insert(0, '/home/myusername/prettyprint/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

当我运行gdb时,收到此错误消息:

Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "/home/myusername/prettyprint/python/libstdcxx/v6/printers.py", line 1266, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "/usr/myusername/gdb/python/gdb/printing.py", line 146, in register_pretty_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6

我搜索了这方面的帮助,发现文件中的第二行(register_libstdcxx_printers (None))没有必要,所以我删除了它。然后,当我运行gdb并输入:

info pretty-print

我得到了这个输出,表明后端已正确安装:

global pretty-printers:
  .*
    bound
  libstdc++-v6
    __gnu_cxx::_Slist_iterator
    __gnu_cxx::__7::_Slist_iterator
    __gnu_cxx::__7::__normal_iterator
    __gnu_cxx::__7::slist
    __gnu_cxx::__normal_iterator
    __gnu_cxx::slist
    __gnu_debug::_Safe_iterator
    std::_Deque_const_iterator
    std::_Deque_iterator
    std::_List_const_iterator
    std::_List_iterator
    std::_Rb_tree_const_iterator
    std::_Rb_tree_iterator
    std::__7::_Deque_const_iterator
    std::__7::_Deque_iterator
    std::__7::_List_const_iterator
    std::__7::_List_iterator
    std::__7::_Rb_tree_const_iterator
---Type <return> to continue, or q <return> to quit---
    std::__7::_Rb_tree_iterator
    std::__7::__cxx11::basic_string
    std::__7::basic_string
    std::__7::bitset
    std::__7::deque
    std::__7::forward_list
    std::__7::list
    std::__7::map
    std::__7::multimap
    std::__7::multiset
    std::__7::priority_queue
    std::__7::queue
    std::__7::set
    std::__7::shared_ptr
    std::__7::stack
    std::__7::tuple
    std::__7::unique_ptr
    std::__7::unordered_map
    std::__7::unordered_multimap
    std::__7::unordered_multiset
    std::__7::unordered_set
    std::__7::vector
    [... many more lines of output omitted]

为了更好地衡量,我在.gdbinit添加了以下几行:

set print pretty on
set print object on
set print static-members on
set print vtbl on
set print demangle on
set demangle-style gnu-v3
set print sevenbit-strings off

所以我打开Eclipse并开始调试我的应用程序,却发现丑陋的打印仍然有效:

Debugger still using ugly print

如何解决此问题以使用GDB的漂亮打印件;即使安装也很漂亮?

1 个答案:

答案 0 :(得分:4)

屏幕截图中的值看起来像内存地址,这让我相信您正在尝试检查指针到STL类型的实例。 AFAIK,漂亮的打印机不会自动取消引用指针,但如果add a watch expression使指针屈服,则会打印出漂亮的打印件。

您使用的其他.gdbinit行不是必需的;以下步骤是所有应该要求的(对于Eclipse Mars.1):

  1. 下载漂亮的打印机:

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  2. 使用以下内容创建/home/<user>/.gdbinit文件:

    python
    import sys
    sys.path.insert(0, '/path/to/prettyprint/python')
    from libstdcxx.v6.printers import register_libstdcxx_printers
    end
    
  3. 在Eclipse的GDB设置(Window-&gt; Preferences-&gt; C / C ++ - &gt; Debug-&gt; GDB)中,将GDB命令文件路径设置为.gdbinit文件创建

  4. 对于需要漂亮打印的任何现有调试配置(运行 - >调试配置),请选择调试配置,然后在调试器选项卡上设置GDB命令文件路径。
  5. 您可以按照以下方式验证GDB的打印效果如何(一旦前一过程的前两个步骤完成):

    1. 将以下代码保存在名为test.cpp的文件中:

      #include <map>
      int main() {
          std::map<char, int> first;
          first['a'] = 10;
          first['b'] = 20;
      }
      
    2. 使用g ++编译:

      $ g++ -g -o test test.cpp
      
    3. 运行gdb:

      $ gdb test
      
    4. 设置断点:

      (gdb) b test.cpp:5
      Breakpoint 1 at 0x40093f: file src/test.cpp, line 5.
      
    5. 运行程序:

      (gdb) run
      Starting program: /path/to/test
      
    6. 点击断点后,将显示gdb提示。使用以下命令打印地图:

      (gdb) p first
      

      如果一切顺利,您应该看到以下输出:

      $1 = std::map with 1 elements = {[97 'a'] = 10}