aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-24 14:39:48 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-24 14:50:36 +0200
commit6b539cfdf04f8f647ad953431be00e3fa561a65c (patch)
treed68d0937fac106c485743c38fc6b8a91f8e9ba20 /libs/kstd
parentbc1cc518c3871f5baee72461cf881b5ad54fa993 (diff)
downloadkernel-6b539cfdf04f8f647ad953431be00e3fa561a65c.tar.xz
kernel-6b539cfdf04f8f647ad953431be00e3fa561a65c.zip
kstd: fix smart pointer pretty printers
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