From 6b539cfdf04f8f647ad953431be00e3fa561a65c Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 24 Jul 2026 14:39:48 +0200 Subject: kstd: fix smart pointer pretty printers --- libs/kstd/gdb/smart_pointers.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py index 572fee94..c7b6c660 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -1,6 +1,17 @@ import gdb +def _dereference_dynamic(pointer): + target = pointer.dereference() + try: + dynamic_type = target.dynamic_type + if dynamic_type != target.type: + target = target.cast(dynamic_type) + except gdb.error: + pass + return target + + class KstdUniquePtrPrinter(gdb.ValuePrinter): def __init__(self, val): self.__val = val @@ -15,7 +26,10 @@ class KstdUniquePtrPrinter(gdb.ValuePrinter): def children(self): pointer = self.__val["m_storage"] if int(pointer) != 0: - yield ("get()", pointer.dereference()) + if pointer.type.target().code == gdb.TYPE_CODE_VOID: + yield ("get()", pointer) + else: + yield ("get()", _dereference_dynamic(pointer)) def display_hint(self): return None @@ -45,7 +59,13 @@ class KstdSharedPtrPrinter(gdb.ValuePrinter): control_block = self.__val["m_control_block"] if int(pointer) != 0: - yield ("get()", pointer.dereference()) + if pointer.type.target().code == gdb.TYPE_CODE_VOID: + # GDB cannot dereference a void* - there's no size/layout to interpret it with. This is the + # shared_ptr case (e.g. kapi::devices::device::driver_data) - show the raw address instead + # of crashing. + yield ("get()", pointer) + else: + yield ("get()", _dereference_dynamic(pointer)) def display_hint(self): return None @@ -73,7 +93,10 @@ class KstdWeakPtrPrinter(gdb.ValuePrinter): pointer = self.__val["m_pointer"] if int(pointer) != 0: - yield ("get()", pointer.dereference()) + if pointer.type.target().code == gdb.TYPE_CODE_VOID: + yield ("get()", pointer) + else: + yield ("get()", _dereference_dynamic(pointer)) def display_hint(self): return None @@ -90,7 +113,10 @@ class KstdObserverPtrPrinter(gdb.ValuePrinter): def children(self): if int(self.__pointer) != 0: - yield ("get()", self.__pointer.dereference()) + if self.__pointer.type.target().code == gdb.TYPE_CODE_VOID: + yield ("get()", self.__pointer) + else: + yield ("get()", _dereference_dynamic(self.__pointer)) def display_hint(self): return None -- cgit v1.2.3