pretty-print.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import gdb.printing
  2. def create_iter(item, end, idx):
  3. return vectorPrinter._iterator(item, end, idx)
  4. class vectorPrinter:
  5. class _iterator:
  6. def __init__(self, item, end, idx):
  7. self.item = item
  8. self.end = end
  9. self.size = self.end - self.item
  10. self.idx = idx
  11. def __iter__(self):
  12. return self
  13. def __next__(self):
  14. if self.item >= self.end:
  15. raise StopIteration
  16. key = '[%d]' % self.idx
  17. iter = self.item.dereference()
  18. self.item += 1
  19. self.idx += 1
  20. return key, iter
  21. def __init__(self, val):
  22. self.val = val
  23. def to_string(self):
  24. return "vector of size %d, capacity %d" % (self.val['m_size'], self.val['m_capacity'])
  25. def display_hint(self):
  26. return 'array'
  27. def children(self):
  28. return self._iterator(self.val['m_arr'], self.val['m_arr'] + self.val['m_size'], 0)
  29. class stringPrinter:
  30. def __init__(self, val):
  31. self.val = val
  32. def to_string(self):
  33. return self.val['m_arr']
  34. class listPrinter:
  35. def __init__(self, val):
  36. self.val = val
  37. def to_string(self):
  38. return "list of size %d" % (self.val['head'].reinterpret_cast(gdb.lookup_type("size_t").pointer()) + 2).dereference()
  39. def display_hint(self):
  40. return 'array'
  41. def children(self):
  42. node = self.val['head']['next']
  43. end = self.val['tail']
  44. idx = 0
  45. while node != end:
  46. yield '[%d]' % idx, node['value']
  47. idx += 1
  48. node = node['next']
  49. def build_pretty_printer():
  50. pp = gdb.printing.RegexpCollectionPrettyPrinter("gbos")
  51. pp.add_printer("vector", "^types::vector<.*?>$", vectorPrinter)
  52. pp.add_printer("string", "^types::string<.*?>$", stringPrinter)
  53. pp.add_printer("list", "^types::list<.*?>$", listPrinter)
  54. return pp
  55. gdb.printing.register_pretty_printer(
  56. gdb.current_objfile(),
  57. build_pretty_printer())