forked from cemu-project/Cemu
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.gdbinit
More file actions
47 lines (35 loc) · 1.29 KB
/
Copy path.gdbinit
File metadata and controls
47 lines (35 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
python
import gdb
import re
class BetypePrinter:
PATTERN = re.compile("^betype<.*>$")
def __init__(self, obj):
self._obj = obj
def to_string(self):
underlying = self._obj["m_value"]
reversed_bytes = bytes(reversed(underlying.bytes))
return gdb.Value(reversed_bytes, underlying.type)
class MemptrPrinter:
PATTERN = re.compile("^MEMPTR<.*>$")
def __init__(self, obj):
self._ptr_type = obj.type.strip_typedefs().unqualified().template_argument(0).pointer()
self._guest_address = obj["m_value"].cast(gdb.lookup_type("uint32"))
def ptr(self):
if self._guest_address == 0:
return gdb.Value(0, self._ptr_type)
base_addr = gdb.parse_and_eval('memory_base', global_context=True)
return (self._guest_address + base_addr).reinterpret_cast(self._ptr_type)
def children(self):
return [("raw", self.ptr())]
def to_string(self):
return self._guest_address.format_string(format="x")
def lookup(val):
tag = val.type.strip_typedefs().unqualified().tag
if tag is None:
return None
printers = [BetypePrinter, MemptrPrinter]
for printer in printers:
if printer.PATTERN.match(tag):
return printer(val)
return None
gdb.pretty_printers.append(lookup)