如何为特定类型模板类重载gdb pretty-printer,自定义std::shared_ptr<myClass>打印
GDB的pretty-printer匹配逻辑为先注册的打印机优先匹配,只需要将自定义的shared_ptr打印机注册到默认libstdc++打印机列表的前方,即可覆盖默认打印逻辑,具体操作步骤如下:
步骤1:编写自定义pretty-printer类
针对std::shared_ptr<myClass>的场景,示例代码如下,可根据实际需求调整to_string方法的输出逻辑:
class MySharedPtrPrinter: "Printer for std::shared_ptr<myClass>" def __init__(self, val): # 提取libstdc++版本shared_ptr内部持有的原始对象指针 self.raw_ptr = val['_M_ptr'] def to_string(self): if self.raw_ptr == 0: return "std::shared_ptr<myClass> (empty)" # 可直接调用myClass对应的打印机输出,也可自定义输出字段 myclass_obj = self.raw_ptr.dereference() return f"std::shared_ptr<myClass> holding {myclass_obj}" # 可选:实现该方法可以在展开变量时显示内部字段 def children(self): if self.raw_ptr != 0: yield "myClass instance", self.raw_ptr.dereference()
步骤2:实现匹配逻辑并注册高优先级打印机
注册时将自定义打印机插入全局打印机列表最前端,保证优先匹配:
import gdb.printing def my_printer_lookup(val): typename = str(val.type.strip_typedefs()) # 匹配std::shared_ptr<myClass>类型 if typename.startswith('std::shared_ptr<myClass>'): return MySharedPtrPrinter(val) # 不匹配的场景返回None,交给后续打印机处理 return None # 注册打印机,replace=True保证重复加载时不会重复注册 gdb.printing.register_pretty_printer(None, my_printer_lookup, replace=True)
步骤3:加载打印机到GDB
将上述Python代码保存为my_shared_ptr_printer.py,在GDB交互界面执行如下命令即可生效:source /path/to/my_shared_ptr_printer.py
验证与排障
如果打印未生效,可执行info pretty-printer命令查看自定义打印机是否位于列表最上方,优先级高于默认的libstdc++打印机即可。
内容的提问来源于stack exchange,提问作者gaurav
相关产品推荐
相关产品推荐

