64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
|
|
import gdb
|
||
|
|
|
||
|
|
from typing import Optional, Union
|
||
|
|
|
||
|
|
|
||
|
|
class Value(gdb.Value):
|
||
|
|
def __init__(self, value: Union[gdb.Value, "Value"]):
|
||
|
|
super().__init__(value)
|
||
|
|
|
||
|
|
def __getitem__(self, key):
|
||
|
|
try:
|
||
|
|
value = super().__getitem__(key)
|
||
|
|
except gdb.error:
|
||
|
|
value = super().__getattr__(key)
|
||
|
|
return Value(value)
|
||
|
|
|
||
|
|
def __getattr__(self, key):
|
||
|
|
if hasattr(super(), key):
|
||
|
|
return Value(super().__getattribute__(key))
|
||
|
|
return Value(super().__getitem__(key))
|
||
|
|
|
||
|
|
def cast(
|
||
|
|
self, type_name: Union[str, gdb.Type], ptr: bool = False
|
||
|
|
) -> Optional["Value"]:
|
||
|
|
try:
|
||
|
|
gdb_type = (
|
||
|
|
gdb.lookup_type(type_name) if isinstance(type_name, str) else type_name
|
||
|
|
)
|
||
|
|
if ptr:
|
||
|
|
gdb_type = gdb_type.pointer()
|
||
|
|
return Value(super().cast(gdb_type))
|
||
|
|
except gdb.error:
|
||
|
|
return None
|
||
|
|
|
||
|
|
def super_value(self, attr: str) -> "Value":
|
||
|
|
return self[attr]
|
||
|
|
|
||
|
|
def as_string(self):
|
||
|
|
"""Convert to string if possible"""
|
||
|
|
try:
|
||
|
|
return self.string()
|
||
|
|
except gdb.error:
|
||
|
|
return str(self)
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
"""Provide better string representation for debugging"""
|
||
|
|
try:
|
||
|
|
ptr_val = int(self)
|
||
|
|
return f"({self.type})0x{ptr_val:x}"
|
||
|
|
except gdb.error:
|
||
|
|
pass
|
||
|
|
|
||
|
|
return super().__str__()
|
||
|
|
|
||
|
|
def __repr__(self):
|
||
|
|
"""Provide detailed representation"""
|
||
|
|
try:
|
||
|
|
content = self.dereference()
|
||
|
|
return f"Value({self.__str__()}: {content})"
|
||
|
|
except gdb.error:
|
||
|
|
pass
|
||
|
|
|
||
|
|
return f"Value({self.__str__()})"
|