如何在GDB中禁用特定美化打印机?以C++11 std::unique_ptr为例
如何在GDB中禁用特定的美化打印机(比如std::unique_ptr)
我之前调试的时候也碰到过这个需求——自带的美化打印机有时候会把std::unique_ptr这类容器包装得太“友好”,反而看不到底层的内存结构。GDB的帮助文档确实没给太直白的例子,下面是我亲测有效的步骤,分临时和永久两种场景:
第一步:先找到目标打印机的信息
首先得确认你要禁用的打印机到底叫什么、在哪个组里。在GDB命令行输入:
info pretty-printers
这个命令会列出所有已注册的美化打印机,比如std::unique_ptr的打印机通常在libstdc++-v3这个分组下面,输出大概长这样:
global pretty-printers:
libstdc++-v3:
...
std::unique_ptr
...
记下来这个分组名(libstdc++-v3)和打印机名(std::unique_ptr),或者也可以看前面的编号(比如假设它是第3项)。
临时禁用(仅当前GDB会话生效)
有两种简单的方式:
- 用编号禁用:如果刚才查到unique_ptr的打印机编号是3,直接输入:
disable pretty-printer 3 - 用名字精准禁用:更稳妥的方式是指定分组和名字,避免误禁用其他打印机:
执行完之后,再打印unique_ptr变量,就能看到它的原始结构体了,比如disable pretty-printer global libstdc++-v3 std::unique_ptr_M_t里的指针和deleter细节。
永久禁用(每次启动GDB都生效)
如果不想每次调试都重复操作,可以修改GDB的初始化文件:
- Linux/macOS:编辑
~/.gdbinit文件 - Windows:编辑
%USERPROFILE%\.gdbinit文件
在文件末尾添加一行刚才的精准禁用命令:
disable pretty-printer global libstdc++-v3 std::unique_ptr
保存后,下次启动GDB时,这个打印机就自动被禁用了。
小技巧:临时查看原始结构(不用禁用打印机)
如果只是偶尔想看看unique_ptr的原始结构,不想专门去禁用打印机,可以用/r(raw)参数打印:
print /r my_unique_ptr
这个命令会跳过美化打印机,直接输出变量的原始内存布局,用完也不用恢复设置,非常方便。
内容的提问来源于stack exchange,提问作者user2771324
相关产品推荐
相关产品推荐

