diff options
Diffstat (limited to 'libs/kstd/gdb')
| -rw-r--r-- | libs/kstd/gdb/smart_pointers.py | 34 |
1 files 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<void> 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 |
