From 6ac1537d07dffa3482bbccf710a77a7316191c2e Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 May 2026 12:09:27 +0200 Subject: debug: use gdb.ValuePrinter base class --- kapi/gdb/address.py | 15 ++++++++------- kapi/gdb/device.py | 17 ++++++++++++++--- libs/kstd/gdb/smart_pointers.py | 27 ++++++++++++++------------- libs/kstd/gdb/string.py | 2 +- libs/kstd/gdb/units.py | 0 libs/kstd/gdb/vector.py | 25 ++++++++++++++++--------- scripts/gdb/teachos/__init__.py | 30 ------------------------------ 7 files changed, 53 insertions(+), 63 deletions(-) create mode 100644 libs/kstd/gdb/units.py diff --git a/kapi/gdb/address.py b/kapi/gdb/address.py index 24fe681..429db1d 100644 --- a/kapi/gdb/address.py +++ b/kapi/gdb/address.py @@ -1,15 +1,14 @@ import gdb -from teachos import TeachOSBasePrinter -class KapiMemoryAddressPrinter(TeachOSBasePrinter): +class KapiMemoryAddressPrinter(gdb.ValuePrinter): def __init__(self, val): - super().__init__(val) + self.__val = val self.__type = val.type.template_argument(0) def to_string(self): try: - raw_address = int(self.value["m_value"]) + raw_address = int(self.__val["m_value"]) type_string = str(self.__type) if "linear" in type_string: @@ -21,10 +20,12 @@ class KapiMemoryAddressPrinter(TeachOSBasePrinter): return f"{raw_address:#018x}{suffix}" except Exception as e: - return f"{self.value}: {e}" + return f"{self.__val}: {e}" def children(self): if "linear" in str(self.__type): pointer_type = gdb.lookup_type("std::byte").pointer() - yield ("[bytes]", self.value["m_value"].cast(pointer_type)) - yield from super().children() + yield ("[bytes]", self.__val["m_value"].cast(pointer_type)) + + def display_hint(self): + return None diff --git a/kapi/gdb/device.py b/kapi/gdb/device.py index b655972..8e515ef 100644 --- a/kapi/gdb/device.py +++ b/kapi/gdb/device.py @@ -1,9 +1,20 @@ import gdb -from teachos import TeachOSBasePrinter -class KapiDevicesDevicePrinter(TeachOSBasePrinter): +class KapiDevicesDevicePrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + def to_string(self): return ( - f"{self.value['m_name']} @ {self.value['m_major']}:{self.value['m_minor']}" + f"{self.__val['m_name']} @ {self.__val['m_major']}:{self.__val['m_minor']}" ) + + def children(self): + yield ("major", self.__val["m_major"]) + yield ("minor", self.__val["m_minor"]) + yield ("name", self.__val["m_name"]) + yield ("parent", self.__val["m_parent"]) + + def display_hint(self): + return None diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py index 0c14c77..b94d466 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -1,34 +1,34 @@ import gdb -from teachos import TeachOSBasePrinter -class KstdUniquePtrPrinter(TeachOSBasePrinter): +class KstdUniquePtrPrinter(gdb.ValuePrinter): def __init__(self, val): - super().__init__(val) + self.__val = val self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.value["pointer"] + 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.value["pointer"] + pointer = self.__val["pointer"] if int(pointer) != 0: yield ("get()", pointer.dereference()) - yield from super().children() + def display_hint(self): + return None -class KstdSharedPtrPrinter(TeachOSBasePrinter): +class KstdSharedPtrPrinter(gdb.ValuePrinter): def __init__(self, val): - super().__init__(val) + self.__val = val self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.value["pointer"] - control_block = self.value["control"] + 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)" @@ -41,10 +41,11 @@ class KstdSharedPtrPrinter(TeachOSBasePrinter): ) def children(self): - pointer = self.value["pointer"] - control_block = self.value["control"] + pointer = self.__val["pointer"] + control_block = self.__val["control"] if int(pointer) != 0: yield ("get()", pointer.dereference()) - yield from super().children() + def display_hint(self): + return None diff --git a/libs/kstd/gdb/string.py b/libs/kstd/gdb/string.py index 2688061..73c22d6 100644 --- a/libs/kstd/gdb/string.py +++ b/libs/kstd/gdb/string.py @@ -1,7 +1,7 @@ import gdb -class KstdStringPrinter: +class KstdStringPrinter(gdb.ValuePrinter): def __init__(self, val): self.__val = val diff --git a/libs/kstd/gdb/units.py b/libs/kstd/gdb/units.py new file mode 100644 index 0000000..e69de29 diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py index b3604de..69f8ca2 100644 --- a/libs/kstd/gdb/vector.py +++ b/libs/kstd/gdb/vector.py @@ -1,21 +1,28 @@ import gdb -from teachos import TeachOSBasePrinter -class KstdVectorPrinter(TeachOSBasePrinter): +class KstdVectorPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__size = int(val["m_size"]) + self.__capacity = int(val["m_capacity"]) + def to_string(self): - size = int(self.value["m_size"]) - capacity = int(self.value["m_capacity"]) - return f"vector of length {size}, capacity {capacity}" + return f"vector of length {self.__size}, capacity {self.__capacity}" def children(self): - size = int(self.value["m_size"]) - data_pointer = self.value["m_data"] - for i in range(size): + data_pointer = self.__val["m_data"] + for i in range(self.__size): yield (f"[{i}]", (data_pointer + i).dereference()) + def child(self, n): + if n < self.__size: + return (f"[{n}]", (self.__val["m_data"] + n).dereference()) + else: + raise gdb.MemoryError("Index out of range") + def display_hint(self): return "array" def num_children(self): - return int(self.value["m_size"]) + return self.__size diff --git a/scripts/gdb/teachos/__init__.py b/scripts/gdb/teachos/__init__.py index d90d6ad..e69de29 100644 --- a/scripts/gdb/teachos/__init__.py +++ b/scripts/gdb/teachos/__init__.py @@ -1,30 +0,0 @@ -import gdb - - -class TeachOSBasePrinter: - def __init__(self, val): - self.__val = val - - @property - def value(self): - return self.__val - - def children(self): - real_type = self.value.type.strip_typedefs() - - if real_type.code not in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION): - return - - for field in real_type.fields(): - if field.artificial: - continue - - try: - if field.is_base_class: - yield (field.name, self.value.cast(field.type)) - elif field.name is not None: - yield (field.name, self.value[field.name]) - else: - yield ("", self.value[field]) - except gdb.error: - yield (str(field.name), "") -- cgit v1.2.3