GDB配置
gdb --help # 可查看配置文件路径

全局配置/etc/gdbinit;用户配置文件~/.gdbinit
以可读方式打印STL
当你尝试使用 GDB 的 "print"(打印)命令来显示向量、堆栈或任何其他 GDB 抽象数据结构的内容时,你将得到无用的结果。
GDB7.0之后,将支持用Python编写pretty-printers
这一特性配合libstdc++ svn(git)仓库,就是可视化C++容器的最好方式
配置方法主要分为两步
- 从gcc的仓库拉取对应的Python目录
- 配置gdbinit文件,使之加载pretty-printers脚本
# ~/.gdbinit
python
import sys
sys.path.insert(0, '/path/to/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
info pretty-printers # 可查看已加载的pretty-printer
gdb的数据目录
gdb中,有一个设置记录了数据目录data-directory
show data-direcotry #查看数据目录位置

数据目录的内容如下,其中python目录下保存得是,gdb启动时自动加载的Python脚本

参考链接
STLSupport - GDB Wiki(看这个即可)
gcc - git
Writing a Pretty-Printer
可能出现的错误
路径配置错误,导致导入报错
路径写到Python即可

--

版本错误
在打印unordered_map时,报错,说是缺少方法或成员
可能的原因:因为编译新项目,更新了动态库libstdc++.so.6.19->libstdc++.so.6.21
导致STL代码与gcc提供的printers不匹配
解决方案:从gcc仓库下载对应版本的printers,在配置文件中加载

有时候并不一定是版本问题,只是软件抽风了,重新手动导入printer即可(推荐先手动导入试试,能不麻烦就不麻烦)

pretty-printers重复加载
这个报错是解决第二个问题的副作用
在~/.gdbinit中加载了对应版本的Python脚本之后,就报了这个错误

其实解决这个报错也简单(虽然耗费了我很多精力)
结合第二节的信息和报错信息,可以看到,python/gdb/printing.py中也加载了同名pretty-printer:libstdc++-v6
因此,将该printing.py删除,然后在.gdbinit中导入下载好的printers.py,重新启动gdb
发现pretty-printers加载正常

参考链接
gcc与libstdc++版本对应关系

浙公网安备 33010602011771号