我正在尝试查看C ++ STL容器的内容。我读了here,默认情况下gcc和gdb的最新版本支持相当打印但是当我尝试显示地图时,我得到了以下内容:
然后,我尝试根据this回答设置漂亮的打印,但仍显示相同的输出。有人可以帮帮我吗?感谢。
我正在使用Ubuntu 16.04,g ++ 5.4.1,GDB 7.11.1和python 2.7.12(从其官方来源安装)。
答案 0 :(得分:3)
在你提到的另一个帖子中已经提到过某些版本的GDB work with Python 3 only。
可以排除可能的原因,因为就您的描述而言,您没有收到任何错误。
在sourceware.org结束时建议
您可以使用Python编程语言扩展gdb。仅当gdb使用
configure
--with-python
时才能使用此功能。
不确定您是否这样做,因为您使用的指南没有直接提及。
答案 1 :(得分:2)
Ubuntu 16.04原生的gdb应该可以打印std::map
;从class StdMapPrinter
包中的以下文件中处理libstdc++6
的python代码:
/usr/share/gcc-5/python/libstdcxx/v6/printers.py
如果您的目标是使用从源代码构建的二进制文件来实现此目的,那么首先使用本机Ubuntu软件包作为比较的基础可能仍然有用。漂亮的打印机不能在你自己构建的gdb中运行的可能原因是libstdcxx/v6/printers.py
(python命名空间中的libstdcxx.v6.printers
)不是gdb期望找到它的地方。
此外,Ubuntu 16.04的原生gdb链接到python3,而不是python2;一种看待它的方法是在
的输出中ldd /usr/bin/gdb
Ubuntu 16.04的原生libstdcxx.v6.printers
似乎可以与python2或python3一起使用。
如果尚未安装本机gdb二进制文件,则可以使用:
apt install gdb
答案 2 :(得分:1)
--with-python
选项构建了我自己的 gdb 8.0 版本,但我仍然无法看到容器内容。 gdb 显示了所有复杂的结构。所以我遵循马克的建议。
您需要在 gdb 安装目录中创建一个软链接(自动加载)。
如果您的 gdb 安装目录是$HOME/gdb_install
,那么
cd $HOME/gdb_install/share/gdb
ln -s /usr/share/gdb/auto-load auto-load
我的Ubuntu安装中已经存在 /usr/share/gdb/auto-load
。这是 gdb 版本7.11.1
。
之后 gdb 显示容器内容。谢谢Mark。