mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-25 22:14:34 +00:00
52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import gdb
|
|
|
|
class BasicStringPrinter:
|
|
def __init__(self, val):
|
|
self.val = val
|
|
|
|
def to_string(self):
|
|
try:
|
|
data = self.val['_data']
|
|
size = int(self.val['_size'])
|
|
capacity = int(self.val['_capacity'])
|
|
if int(data) == 0:
|
|
return '<null>'
|
|
content = data.string(length=size)
|
|
return f"'{content}' (size={size}, cap={capacity})"
|
|
except gdb.error:
|
|
return '<invalid string>'
|
|
|
|
def children(self):
|
|
try:
|
|
data = self.val['_data']
|
|
size = int(self.val['_size'])
|
|
if int(data) == 0:
|
|
return
|
|
for i in range(size):
|
|
yield (f'[{i}]', (data + i).dereference())
|
|
except gdb.error:
|
|
return
|
|
|
|
def display_hint(self):
|
|
return 'array'
|
|
|
|
def lookup_fennix_string(val):
|
|
try:
|
|
typename = str(val.type.strip_typedefs())
|
|
fields = val.type.fields()
|
|
field_names = [f.name for f in fields]
|
|
if '_data' in field_names and '_size' in field_names and '_capacity' in field_names:
|
|
return BasicStringPrinter(val)
|
|
except:
|
|
pass
|
|
return None
|
|
|
|
gdb.pretty_printers.append(lookup_fennix_string)
|
|
|
|
def build_pretty_printers():
|
|
pp = gdb.printing.RegexpCollectionPrettyPrinter("fennix")
|
|
pp.add_printer('std::string', '^std::string$', BasicStringPrinter)
|
|
return pp
|
|
|
|
gdb.printing.register_pretty_printer(None, build_pretty_printers(), replace=True)
|