plugins.py (1345B)
1 import gdb 2 import gdb.printing 3 4 def fuck_you_gdb(s, member, default): 5 try: 6 return s[member] 7 except: 8 return default 9 10 class Arena_printer(gdb.ValuePrinter): 11 def __init__(self, val): 12 self.val = val 13 14 def to_string(self): 15 beg = self.val["beg"] 16 end = self.val["end"] 17 return '{capacity: %d}' % (end - beg) 18 19 class Stream_printer(gdb.ValuePrinter): 20 def __init__(self, val): 21 self.val = val 22 23 def to_string(self): 24 len = self.val["widx"] 25 str = self.val["data"].string(length=min(max(len, 0), 64)) 26 return '{len = %d, data = "%s"}' % (len, str) 27 28 class str8_printer(gdb.ValuePrinter): 29 def __init__(self, val): 30 self.val = val 31 def to_string(self): 32 len = fuck_you_gdb(self.val, "len", 0); 33 if len == 0: 34 len = fuck_you_gdb(self.val, "length", 0) 35 str = self.val["data"].string(length=min(max(len, 0), 64)) 36 37 return '{length = %d, data = "%s"}' % (len, str) 38 39 def build_pretty_printer(): 40 pp = gdb.printing.RegexpCollectionPrettyPrinter("rnpnr") 41 pp.add_printer("s8", "s8", str8_printer) 42 pp.add_printer("str8", "str8", str8_printer) 43 pp.add_printer("Arena", "Arena", Arena_printer) 44 pp.add_printer("Stream", "Stream", Stream_printer) 45 return pp 46 47 gdb.printing.register_pretty_printer( 48 gdb.current_objfile(), build_pretty_printer() 49 )