diff options
Diffstat (limited to 'libs/kstd/gdb')
| -rw-r--r-- | libs/kstd/gdb/__init__.py | 23 | ||||
| -rw-r--r-- | libs/kstd/gdb/smart_pointers.py | 68 | ||||
| -rw-r--r-- | libs/kstd/gdb/string.py | 27 | ||||
| -rw-r--r-- | libs/kstd/gdb/units.py | 0 | ||||
| -rw-r--r-- | libs/kstd/gdb/vector.py | 41 |
5 files changed, 159 insertions, 0 deletions
diff --git a/libs/kstd/gdb/__init__.py b/libs/kstd/gdb/__init__.py new file mode 100644 index 0000000..c5d1e53 --- /dev/null +++ b/libs/kstd/gdb/__init__.py @@ -0,0 +1,23 @@ +import gdb.printing + +from .vector import KstdVectorPrinter +from .string import KstdStringPrinter +from .smart_pointers import ( + KstdUniquePtrPrinter, + KstdSharedPtrPrinter, + KstdObserverPtrPrinter, +) + + +def build_pretty_printers(): + pp = gdb.printing.RegexpCollectionPrettyPrinter("kstd") + pp.add_printer("vector", "^kstd::vector<.*>$", KstdVectorPrinter) + pp.add_printer("string", "^kstd::string$", KstdStringPrinter) + pp.add_printer("unique_ptr", "^kstd::unique_ptr<.*>$", KstdUniquePtrPrinter) + pp.add_printer("shared_ptr", "^kstd::shared_ptr<.*>$", KstdSharedPtrPrinter) + pp.add_printer("observer_ptr", "^kstd::observer_ptr<.*>$", KstdObserverPtrPrinter) + return pp + + +def register_printers(objfile): + gdb.printing.register_pretty_printer(objfile, build_pretty_printers(), replace=True) diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py new file mode 100644 index 0000000..f6e8a45 --- /dev/null +++ b/libs/kstd/gdb/smart_pointers.py @@ -0,0 +1,68 @@ +import gdb + + +class KstdUniquePtrPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__type = val.type.template_argument(0) + + def to_string(self): + pointer = self.__val["pointer"] + if int(pointer) == 0: + return f"kstd::unique_ptr<{self.__type}> (empty)" + return f"kstd::unique_ptr<{self.__type}>" + + def children(self): + pointer = self.__val["pointer"] + if int(pointer) != 0: + yield ("get()", pointer.dereference()) + + def display_hint(self): + return None + + +class KstdSharedPtrPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__type = val.type.template_argument(0) + + def to_string(self): + pointer = self.__val["pointer"] + control_block = self.__val["control"] + + if int(pointer) == 0 or int(control_block) == 0: + return f"shared_ptr<{self.__type}> (empty)" + + strong_refs = int(control_block["shared_count"]["_M_i"]) + weak_refs = int(control_block["weak_count"]["_M_i"]) + + return ( + f"shared_ptr<{self.__type}> use count {strong_refs}, weak count {weak_refs}" + ) + + def children(self): + pointer = self.__val["pointer"] + control_block = self.__val["control"] + + if int(pointer) != 0: + yield ("get()", pointer.dereference()) + + def display_hint(self): + return None + + +class KstdObserverPtrPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__type = val.type.template_argument(0) + self.__pointer = val["m_ptr"] + + def to_string(self): + return f"{(self.__pointer)}" + + def children(self): + if int(self.__pointer) != 0: + yield ("get()", self.__pointer.dereference()) + + def display_hint(self): + return None diff --git a/libs/kstd/gdb/string.py b/libs/kstd/gdb/string.py new file mode 100644 index 0000000..73c22d6 --- /dev/null +++ b/libs/kstd/gdb/string.py @@ -0,0 +1,27 @@ +import gdb + + +class KstdStringPrinter(gdb.ValuePrinter): + + def __init__(self, val): + self.__val = val + + def to_string(self): + storage = self.__val["m_storage"] + storage_size = int(storage["m_size"]) + + if storage_size <= 0: + return '""' + + data_pointer = storage["m_data"] + string_length = storage_size - 1 + + try: + if hasattr(data_pointer, "lazy_string"): + return data_pointer.lazy_string(encoding="utf-8", length=string_length) + return data_pointer.string(encoding="utf-8", length=string_length) + except gdb.error: + return "<unreadable memory>" + + def display_hint(self): + return "string" diff --git a/libs/kstd/gdb/units.py b/libs/kstd/gdb/units.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libs/kstd/gdb/units.py diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py new file mode 100644 index 0000000..f11e064 --- /dev/null +++ b/libs/kstd/gdb/vector.py @@ -0,0 +1,41 @@ +import gdb + + +class KstdVectorPrinter(gdb.ValuePrinter): + class Iterator: + def __init__(self, begin: gdb.Value, end: gdb.Value): + self._item = begin + self._end = end + self._count = 0 + + def __iter__(self): + return self + + def __next__(self): + count = self._count + self._count = count + 1 + + if self._item == self._end: + raise StopIteration + + element = self._item.dereference() + self._item = self._item + 1 + return (f"[{count}]", element) + + def __init__(self, val: gdb.Value): + self.__val = val + self.__size = int(val["m_size"]) + self.__capacity = int(val["m_capacity"]) + self.__data = val["m_data"] + + def to_string(self): + return f"vector of length {self.__size}, capacity {self.__capacity}" + + def children(self): + return self.Iterator(self.__data, self.__data + self.__size) + + def display_hint(self): + return "array" + + def num_children(self): + return self.__size |
