diff options
-rw-r--r-- | misc/lldb_disasm.py | 90 |
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) |