c++oding="utf-8" ?>
直接用系统自带的 libstdc++ pretty printer 脚本即可支持 vector、string、map 等主流 stl 容器,但需确保 gdb 正确加载 python 模块且路径配置绝对、可读;unordered_map 等 c++11/c++17 容器在 gcc

直接用系统自带的 libstdc++ pretty printer 脚本就能支持大部分 STL 容器(vector、string、map 等),但前提是你的 GDB 能加载到对应 Python 模块,且路径配置正确——不是装了高版本 GCC 就自动生效。
确认 GDB 是否已内置 libstdc++ pretty printer
运行 gdb --version 查看 GDB 版本;再启动 gdb,输入:
python print(gdb.libstdcxx.v6.printers)
如果报 AttributeError: module 'gdb' has no attribute 'libstdcxx',说明没加载成功,别急着自己下载脚本,先查路径:
-
gcc -v输出末尾会显示libdir,比如/usr/lib/gcc/x86_64-linux-gnu/12 - 进去找
python子目录:ls /usr/lib/gcc/x86_64-linux-gnu/12/python/libstdcxx/v6/printers.py - 如果存在,就说明脚本已随 GCC 安装,只需让 GDB 找到它
.gdbinit 中 Python 路径必须绝对且可访问
很多失败都卡在 sys.path.insert(0, ...) 这一行:路径写错、权限不足、或用了相对路径(.gdbinit 加载时工作目录不固定)。
正确做法是:
- 用
readlink -f获取脚本绝对路径,例如:/usr/lib/gcc/x86_64-linux-gnu/12/python - 在
~/.gdbinit里写死这个绝对路径,不要用~或$HOME - 确保该路径下有
libstdcxx/v6/printers.py,且文件可读 - 加一句
python print("loaded")在python块末尾,启动 GDB 时能看到输出才说明执行到了
unordered_map 和 C++17 容器可能仍不显示内容
即使标准 printers.py 加载成功,unordered_map、optional、variant 等在 GCC 10 之前默认不支持——它们的 pretty printer 是后来逐步补全的。
验证方法:
- 写个最小测试程序,含
std::unordered_map<int std::string> m;</int> - 在 GDB 里
p m,如果仍显示_M_h = { _M_bkt = {...} }这类内部字段,就是没生效 - 此时需升级 GCC(≥11)或手动替换
printers.py:从 GCC 源码树的libstdc++-v3/python目录同步最新版 - 注意:新版脚本可能依赖更新的 Python API,GDB AttributeError: 'gdb.Value' object has no attribute 'address',得一并升级 GDB
最易被忽略的一点:GDB 启动时不会提示路径加载失败,也不会报错退出——它只是静默跳过整个 python 块。务必用 python print(...) 或 info pretty-printer 主动验证是否注册成功。











