diff --git a/gdbprinters.py b/gdbprinters.py new file mode 100644 index 0000000..eced00e --- /dev/null +++ b/gdbprinters.py @@ -0,0 +1,81 @@ +import gdb +import gdb.printing + +class SharedPointerPrinter: + "Print a shared_ptr or weak_ptr" + + class _iterator: + def __init__(self, sharedPointer): + self.sharedPointer = sharedPointer + self.managedValue = sharedPointer.val['_M_ptr'] + self.count = 0 + + def __iter__(self): + return self + + def next(self): + if self.managedValue == 0: + raise StopIteration + self.count = self.count + 1 + if (self.count == 1): + return ('Use count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_use_count']) + elif (self.count == 2): + return ('Weak count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_weak_count'] - 1) + elif (self.count == 3): + return ('Managed value', self.managedValue) + else: + raise StopIteration + + def __init__ (self, typename, val): + self.typename = typename + self.val = val + + def children (self): + return self._iterator(self) + + def to_string (self): + state = 'empty' + refcounts = self.val['_M_refcount']['_M_pi'] + if refcounts != 0: + usecount = refcounts['_M_use_count'] + weakcount = refcounts['_M_weak_count'] + if usecount == 0: + state = 'expired, weakcount %d' % weakcount + else: + state = 'usecount %d, weakcount %d' % (usecount, weakcount - 1) + return '%s (%s) to %s' % (self.typename, state, self.val['_M_ptr']) + +class UniquePointerPrinter: + "Print a unique_ptr" + + class _iterator: + def __init__(self, uniquePointer): + self.uniquePointer = uniquePointer + self.managedValue = uniquePointer.val['_M_t']['_M_head_impl'] + self.count = 0 + + def __iter__(self): + return self + + def next(self): + if self.managedValue == 0 or self.count == 1: + raise StopIteration + self.count = self.count + 1 + return ('Managed value', self.managedValue) + + def __init__ (self, typename, val): + self.val = val + + def children (self): + return self._iterator(self) + + def to_string (self): + v = self.val['_M_t']['_M_head_impl'] + return ('std::unique_ptr<%s> containing %s' % (str(v.type.target()), + str(v))) + +def mk_pretty_printers(): + pp = gdb.printing.RegexpCollectionPrettyPrinter("myprinters") + pp.add_printer('shared_ptr', '^std::shared_ptr', SharedPointerPrinter) + pp.add_printer('unique_ptr', '^std::unique_ptr', UniquePointerPrinter) + return pp