我在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的漂亮打印件;即使安装也很漂亮?
答案 0 :(得分:4)
屏幕截图中的值看起来像内存地址,这让我相信您正在尝试检查指针到STL类型的实例。 AFAIK,漂亮的打印机不会自动取消引用指针,但如果add a watch expression使指针屈服,则会打印出漂亮的打印件。
您使用的其他.gdbinit
行不是必需的;以下步骤是所有应该要求的(对于Eclipse Mars.1):
下载漂亮的打印机:
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
使用以下内容创建/home/<user>/.gdbinit
文件:
python
import sys
sys.path.insert(0, '/path/to/prettyprint/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
end
在Eclipse的GDB设置(Window-&gt; Preferences-&gt; C / C ++ - &gt; Debug-&gt; GDB)中,将GDB命令文件路径设置为.gdbinit
文件创建
您可以按照以下方式验证GDB的打印效果如何(一旦前一过程的前两个步骤完成):
将以下代码保存在名为test.cpp
的文件中:
#include <map>
int main() {
std::map<char, int> first;
first['a'] = 10;
first['b'] = 20;
}
使用g ++编译:
$ g++ -g -o test test.cpp
运行gdb:
$ gdb test
设置断点:
(gdb) b test.cpp:5
Breakpoint 1 at 0x40093f: file src/test.cpp, line 5.
运行程序:
(gdb) run
Starting program: /path/to/test
点击断点后,将显示gdb提示。使用以下命令打印地图:
(gdb) p first
如果一切顺利,您应该看到以下输出:
$1 = std::map with 1 elements = {[97 'a'] = 10}