gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:42 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com