diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-30 17:30:35 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-30 17:30:35 +0200 |
| commit | 58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a (patch) | |
| tree | 87527422732ec9dc022fcd4f0e21b4b36d3f4470 /libs/kstd/gdb/error_code.py | |
| parent | 3e87bb1da9e4980286d0d44b29f22a5dc8bb33d5 (diff) | |
| download | kernel-58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a.tar.xz kernel-58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a.zip | |
kstd/gdb: add error_code and result printers
Diffstat (limited to 'libs/kstd/gdb/error_code.py')
| -rw-r--r-- | libs/kstd/gdb/error_code.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/libs/kstd/gdb/error_code.py b/libs/kstd/gdb/error_code.py new file mode 100644 index 00000000..1569f59a --- /dev/null +++ b/libs/kstd/gdb/error_code.py @@ -0,0 +1,66 @@ +import gdb + + +class KstdErrorCodePrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + + def _error_value(self): + return int(self.__val["m_value"]) + + def _category_name(self): + try: + category_pointer = self.__val["m_category"] + if int(category_pointer) == 0: + return "<null category>" + category = category_pointer.dereference() + try: + dynamic = category.dynamic_type + name = str(dynamic) + except gdb.error: + name = str(category.type) + name = name.replace("(anonymous namespace)::", "") + if name.endswith("_t"): + name = name[:-2] + return name + except (gdb.error, AttributeError): + return "?" + + def _message(self): + try: + category_pointer = self.__val["m_category"] + if int(category_pointer) == 0: + return None + value = self._error_value() + address = int(category_pointer) + result = gdb.parse_and_eval( + f"((kstd::error_category const *){address:#x})->message({value})" + ) + try: + ptr = result["_M_str"] + length = int(result["_M_len"]) + if int(ptr) != 0 and length > 0: + return ptr.string(length=length) + except (gdb.error, AttributeError, KeyError): + pass + return str(result) + except (gdb.error, RuntimeError): + return None + + def to_string(self): + value = self._error_value() + category = self._category_name() + msg = self._message() + if msg is not None: + return f"{category}:{value} ({msg})" + return f"{category}:{value}" + + def children(self): + yield ("value", self.__val["m_value"]) + category_pointer = self.__val["m_category"] + if int(category_pointer) != 0: + yield ("category", category_pointer.dereference()) + + def display_hint(self): + return None + |
