You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为特定类型模板类重载gdb pretty-printer,自定义std::shared_ptr<myClass>打印

自定义std::shared_ptr类型GDB Pretty-Printer注册方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:15:11