summaryrefslogtreecommitdiff
path: root/misc/lldb_disasm.py
diff options
context:
space:
mode:
-rw-r--r--misc/lldb_disasm.py90
1 files changed, 66 insertions, 24 deletions
@@ -73,8 +73,14 @@ class IseqDissassembler:
iseq_size = val.GetValueForExpressionPath("->body->iseq_size").GetValueAsUnsigned()
iseqs = val.GetValueForExpressionPath("->body->iseq_encoded")
idx = 0
while idx < iseq_size:
- idx += self.iseq_extract_values(self.debugger, self.target, self.process, self.result, iseqs, idx)
def build_addr2insn(self, target):
tIntPtr = target.FindFirstType("intptr_t")
@@ -98,16 +104,21 @@ class IseqDissassembler:
def iseq_extract_values(self, debugger, target, process, result, iseqs, n):
tValueP = target.FindFirstType("VALUE")
sizeofValueP = tValueP.GetByteSize()
- insn = target.CreateValueFromAddress(
- "i", lldb.SBAddress(iseqs.unsigned + (n * sizeofValueP), target), tValueP)
addr = insn.GetValueAsUnsigned()
orig_insn = self.rb_vm_insn_addr2insn2(target, result, addr)
name = self.insn_name(target, process, result, orig_insn)
length = self.insn_len(target, orig_insn)
- op_types = bytes(self.insn_op_types(target, process, result, orig_insn), 'utf-8')
- print("%04d %s" % (n, name), file=result, end="")
if length == 1:
print("", file=result)
@@ -131,50 +142,81 @@ class IseqDissassembler:
def insn_len(self, target, offset):
size_of_char = self.tChar.GetByteSize()
- addr_of_table = target.FindSymbols("insn_len.t")[0].GetSymbol().GetStartAddress().GetLoadAddress(target)
- addr_in_table = addr_of_table + (offset * size_of_char)
- addr = lldb.SBAddress(addr_in_table, target)
- return target.CreateValueFromAddress("y", addr, self.tChar).GetValueAsUnsigned()
def insn_op_types(self, target, process, result, insn):
tUShort = target.FindFirstType("unsigned short")
- self.tChar = target.FindFirstType("char")
size_of_short = tUShort.GetByteSize()
size_of_char = self.tChar.GetByteSize()
- addr_of_table = target.FindSymbols("insn_op_types.y")[0].GetSymbol().GetStartAddress().GetLoadAddress(target)
addr_in_table = addr_of_table + (insn * size_of_short)
- addr = lldb.SBAddress(addr_in_table, target)
- offset = target.CreateValueFromAddress("y", addr, tUShort).GetValueAsUnsigned()
- addr_of_table = target.FindSymbols("insn_op_types.x")[0].GetSymbol().GetStartAddress().GetLoadAddress(target)
addr_in_name_table = addr_of_table + (offset * size_of_char)
error = lldb.SBError()
- return process.ReadCStringFromMemory(addr_in_name_table, 256, error)
def insn_name_table_offset(self, target, offset):
tUShort = target.FindFirstType("unsigned short")
size_of_short = tUShort.GetByteSize()
- addr_of_table = target.FindSymbols("insn_name.y")[0].GetSymbol().GetStartAddress().GetLoadAddress(target)
- addr_in_table = addr_of_table + (offset * size_of_short)
- addr = lldb.SBAddress(addr_in_table, target)
- return target.CreateValueFromAddress("y", addr, tUShort).GetValueAsUnsigned()
def insn_name(self, target, process, result, offset):
- tCharP = target.FindFirstType("char*")
- addr_of_table = target.FindSymbols("insn_name.x")[0].GetSymbol().GetStartAddress().GetLoadAddress(target)
- addr_in_name_table = addr_of_table + self.insn_name_table_offset(target, offset)
- addr = lldb.SBAddress(addr_in_name_table, target)
error = lldb.SBError()
- return process.ReadCStringFromMemory(addr_in_name_table, 256, error)
def disasm(debugger, command, result, internal_dict):
disassembler = IseqDissassembler(debugger, command, result, internal_dict)