c++ - 为什么 Eclipse 不使用 GDB 的 pretty-print ?

标签 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 并输入:

信息 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 的 pretty-print ; pretty-print 甚至安装了吗?

最佳答案

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

额外的.gdbinit您正在使用的行不是必需的;只需执行以下步骤(对于 Eclipse Mars.1):

  1. 下载 pretty-print :

    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->Preferences->C/C++->Debug->GDB),将 GDB 命令文件路径设置为 .gdbinit您刚刚创建的文件。

  4. 对于任何需要 pretty-print 的现有调试配置(运行 -> 调试配置),选择调试配置,然后在“调试器”选项卡上设置 GDB 命令文件路径。

您可以按如下方式验证 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 提示符。使用以下命令打印 map :

    (gdb) p first
    

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

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

关于c++ - 为什么 Eclipse 不使用 GDB 的 pretty-print ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739409/

相关文章:

java - 在 Mac 上用 Eclipse 运行 tomcat

Eclipse 不启动 : JVM terminated. 退出代码=14

java - 在 MacOS X 上的 Eclipse 中调试速度很慢 - 我能做什么?

ios - swift iOS - 当角色离开屏幕时无法重置游戏场景

node.js - 使用 Node 调试 WebAssembly

c++ static cast with .so 在运行时加载

c++ - 将动态数组初始化为 0?

java - 缺少 appengine-api-labs.jar 和其他必需的库

c++ - 在 C++ 中确定 getline() 起点

c++ - 可以使用缓存制作 QML 应用程序 "offline capable"吗?