【发布时间】:2015-06-26 16:16:34
【问题描述】:
我在 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 开始调试我的应用程序,却发现丑陋的打印仍然有效:
如何解决这个问题以使用 GDB 的漂亮打印;是否安装了漂亮的打印?
【问题讨论】:
-
注意:
gdb -nx和info pretty-print不会产生任何输出。 -
通常你的发行版应该正确安装所有东西。这就是该错误消息的真正含义——您的安装是多余的。
gdb -nx不是一个充分的测试,因为漂亮的打印机是按需加载的;在这种情况下,当 libstdc++.so 由下级加载时。所以你必须用-nx试试。我不知道为什么 Eclipse 不工作,它可能应该工作。 -
@TomTromey 我应该注意我安装了 Eclipse 作为从 Eclipse Foundation 网站下载,而不是使用我系统的包管理器。你能解释一下我应该怎么做吗?用 gdb 加载 libstdc++.so 文件?
-
Eclipse 应该没关系。重要的是gdb。要尝试的一件事是使用 gdb -nx 调试一个普通的 C++ 程序。如果漂亮的打印在那里工作,那么这个错误就在 Eclipse 中。否则,它与您的 gdb(或 libstdc++ 或 ...)设置有关。
-
@TomTromey 我以前从未使用过 GDB,但我运行了一个基本会话,并且能够在
std::vector初始化后打印它的内容:$3 = {<std::__1::__vector_base<int, std::__1::allocator<int> >> = {<std::__1::__vector_base_common<true>> = {<No data fields>}, __begin_ = 0x606010, __end_ = 0x6060e0, __end_cap_ = {<std::__1::__libcpp_compressed_pair_imp<int*, std::__1::allocator<int>, 2>> = {<std::__1::allocator<int>> = {<No data fields>}, __first_ = 0x6060e0}, <No data fields>}}, <No data fields>}所以看起来问题出在 GDB 上。