首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Eclipse不使用GDB的漂亮打印?

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

Stack Overflow用户
提问于 2015-04-20 04:35:41
回答 1查看 3.8K关注 0票数 4

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

到目前为止,我尝试过的是:按照这里指令运行以下命令

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

将其复制到/home/myusername/prettyprint中。

然后,我将这段文字复制到我的.gdbinit中:

代码语言:javascript
复制
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时,收到以下错误消息:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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中添加了以下行

代码语言:javascript
复制
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并开始调试我的应用程序,结果发现丑陋的打印仍然有效:

如何修复这个问题以使用GDB的漂亮打印;是否已安装了漂亮打印?

EN

回答 1

Stack Overflow用户

发布于 2015-09-06 00:24:51

屏幕截图中的值看起来像内存地址,这使我相信您正在检查指向STL类型实例的指针。AFAIK,漂亮的打印机不会自动取消引用指针,但是如果您使用添加一个监视表达式来判断指针,就会自动打印。

您使用的附加.gdbinit行不应该是必需的;以下是所需的全部步骤(对于EclipseMars.1):

  1. 下载漂亮的打印机: svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
  2. 创建一个具有以下内容的/home/<user>/.gdbinit文件: 从libstdcxx.v6导入sys.path.insert(0,'/path/to/prettyprint/ python ')打印机导入register_libstdcxx_printers端
  3. 在Eclipse设置(Window->Preferences->C/C++->Debug-> GDB )中,将GDB命令文件路径设置为您刚刚创建的.gdbinit文件。
  4. 对于任何需要漂亮打印的现有调试配置(Run->Debug配置),请选择调试配置,然后在Debugger选项卡上设置GDB命令文件路径。

您可以验证GDB是否很漂亮,如下所示(一旦完成了前一个过程的前两个步骤):

  1. 将以下代码保存在名为test.cpp的文件中: # int> (){ std::map first;first'a‘= 10;first'b’= 20;}
  2. 用g++编译: $ g++ -g -o test test.cpp
  3. 运行gdb: $ gdb检验
  4. 设置一个断点: B test.cpp:5断点1位于0x40093f: file src/test.cpp,第5行。
  5. 运行程序: (gdb)运行启动程序: /path/to/test
  6. 当命中断点时,将显示gdb提示。使用以下命令打印地图: (gdb) p第一 如果一切顺利,您应该看到以下输出: $1 = std::map有1个元素= {97 'a‘= 10}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29739409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档