aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd')
-rw-r--r--libs/kstd/gdb/smart_pointers.py34
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