GDB漂亮打印机,用于从一个基础派生的类

时间:2018-08-03 01:26:49

标签: c++ gdb pretty-print

我想在我的.gdbinit中添加一个漂亮的打印机,该打印机将用于从包含“值”的基类Base派生的任何类型。这部分起作用:

class MyBasePrinter(gdb.printing.PrettyPrinter):
    def __init__(self, val):
        self.__val = val['value']
    def to_string(self):
        return self.__val
my_pretty_printer = gdb.printing.RegexpCollectionPrettyPrinter('my_printer')
my_printer.add_printer('Base', '^Base.*$', MyBasePrinter)

不幸的是,我在gdb中打印的内容是这样的:

$1 = {<Base class stuff> = <value>}

基类是CRTP模板,因此“基类的东西”变得很长。 另外,我可以为我的每个派生类添加一个单独的漂亮打印机,在这种情况下,打印效果很好,但是每次有人从Base派生新类时,都需要更改.gdbinit。我想知道是否有更好的解决方案?理想情况下,我希望看到印有类似内容的

$1 = <Derived> = <value>

基本和派生的最小代码示例:

template <typename RawType, typename T, template <typename> typename...Traits>
struct IntegralValue : Traits<T>... {
    using raw_type = RawType;
    raw_type value;
    explicit IntegralValue(raw_type v) : value(v) { }
    void operator=(IntegralValue const& rhs) { value = rhs.value; }
};
template <typename T> struct EqualComparable {
    bool operator==(T rhs) const {
        return static_cast<T const*>(this)->value == rhs.value;
    }
    bool operator!=(T rhs) const {
        return static_cast<T const*>(this)->value != rhs.value;
    }
};
template <typename T> struct Incrementable {
    T operator++(int) {
        auto& self = static_cast<T&>(*this);
        T retval = self;
        self.value++;
        return retval;
    }
    // other increment-related operators here
    // ...
};
struct SequenceNumber : IntegralValue<uint64_t, SequenceNumber, EqualComparable, Incrementable> {
    explicit SequenceNumber(raw_type v) : IntegralValue(v) { }
};
struct Id : IntegralValue<uint64_t, Id, EqualComparable> {
    explicit Id(raw_type v) : IntegralType(v) { }
};
auto id = Id(1);
auto s = SequenceNumber(2);
// stop gdb around here and print id and s

1 个答案:

答案 0 :(得分:0)

您的代码具有:

my_pretty_printer = gdb.printing.RegexpCollectionPrettyPrinter('my_printer')

虽然按类型的名称注册gdb漂亮打印机是很常规的-并且有这样的助手使它更简单-实际上并不需要。相反,您可以使用一个识别器,该识别器接受任何值并决定是否为其构造漂亮的打印机。

请参见gdb.pretty_printers in the manual上的部分。您的识别器可以通过检查值的类型以查看其是否源自Base来工作。