diff options
author | isaacs <i@izs.me> | 2012-09-18 15:20:38 -0700 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2012-09-21 01:52:24 +0200 |
commit | 3411a03dd114d635800cc50749d2351cd734eb2a (patch) | |
tree | 0ba1e52ab2236286894b33400302181ece91b63a /deps/v8/tools/grokdump.py | |
parent | cc1b09d6b7c3cc6b8729804cbf644634ba5d0815 (diff) | |
download | node-new-3411a03dd114d635800cc50749d2351cd734eb2a.tar.gz |
V8: Upgrade to 3.13.7.1
Diffstat (limited to 'deps/v8/tools/grokdump.py')
-rwxr-xr-x | deps/v8/tools/grokdump.py | 96 |
1 files changed, 77 insertions, 19 deletions
diff --git a/deps/v8/tools/grokdump.py b/deps/v8/tools/grokdump.py index a9f0cb9ddc..5d9a053afd 100755 --- a/deps/v8/tools/grokdump.py +++ b/deps/v8/tools/grokdump.py @@ -1051,12 +1051,30 @@ class ConsString(String): class Oddball(HeapObject): + # Should match declarations in objects.h + KINDS = [ + "False", + "True", + "TheHole", + "Null", + "ArgumentMarker", + "Undefined", + "Other" + ] + def ToStringOffset(self): return self.heap.PointerSize() + def ToNumberOffset(self): + return self.ToStringOffset() + self.heap.PointerSize() + + def KindOffset(self): + return self.ToNumberOffset() + self.heap.PointerSize() + def __init__(self, heap, map, address): HeapObject.__init__(self, heap, map, address) self.to_string = self.ObjectField(self.ToStringOffset()) + self.kind = self.SmiField(self.KindOffset()) def Print(self, p): p.Print(str(self)) @@ -1065,7 +1083,10 @@ class Oddball(HeapObject): if self.to_string: return "Oddball(%08x, <%s>)" % (self.address, self.to_string.GetChars()) else: - return "Oddball(%08x, kind=%s)" % (self.address, "???") + kind = "???" + if 0 <= self.kind < len(Oddball.KINDS): + kind = Oddball.KINDS[self.kind] + return "Oddball(%08x, kind=%s)" % (self.address, kind) class FixedArray(HeapObject): @@ -1086,7 +1107,13 @@ class FixedArray(HeapObject): base_offset = self.ElementsOffset() for i in xrange(self.length): offset = base_offset + 4 * i - p.Print("[%08d] = %s" % (i, self.ObjectField(offset))) + try: + p.Print("[%08d] = %s" % (i, self.ObjectField(offset))) + except TypeError: + p.Dedent() + p.Print("...") + p.Print("}") + return p.Dedent() p.Print("}") @@ -1394,7 +1421,7 @@ class InspectionPadawan(object): if known_map: return known_map found_obj = self.heap.FindObject(tagged_address) - if found_obj: return found_ob + if found_obj: return found_obj address = tagged_address - 1 if self.reader.IsValidAddress(address): map_tagged_address = self.reader.ReadUIntPtr(address) @@ -1451,6 +1478,24 @@ class InspectionShell(cmd.Cmd): self.padawan = InspectionPadawan(reader, heap) self.prompt = "(grok) " + def do_da(self, address): + """ + Print ASCII string starting at specified address. + """ + address = int(address, 16) + string = "" + while self.reader.IsValidAddress(address): + code = self.reader.ReadU8(address) + if code < 128: + string += chr(code) + else: + break + address += 1 + if string == "": + print "Not an ASCII string at %s" % self.reader.FormatIntPtr(address) + else: + print "%s\n" % string + def do_dd(self, address): """ Interpret memory at the given address (if available) as a sequence @@ -1510,23 +1555,23 @@ class InspectionShell(cmd.Cmd): """ self.padawan.PrintKnowledge() - def do_km(self, address): + def do_kd(self, address): """ Teach V8 heap layout information to the inspector. Set the first - map-space page by passing any pointer into that page. + data-space page by passing any pointer into that page. """ address = int(address, 16) page_address = address & ~self.heap.PageAlignmentMask() - self.padawan.known_first_map_page = page_address + self.padawan.known_first_data_page = page_address - def do_kd(self, address): + def do_km(self, address): """ Teach V8 heap layout information to the inspector. Set the first - data-space page by passing any pointer into that page. + map-space page by passing any pointer into that page. """ address = int(address, 16) page_address = address & ~self.heap.PageAlignmentMask() - self.padawan.known_first_data_page = page_address + self.padawan.known_first_map_page = page_address def do_kp(self, address): """ @@ -1537,6 +1582,17 @@ class InspectionShell(cmd.Cmd): page_address = address & ~self.heap.PageAlignmentMask() self.padawan.known_first_pointer_page = page_address + def do_list(self, smth): + """ + List all available memory regions. + """ + def print_region(reader, start, size, location): + print " %s - %s (%d bytes)" % (reader.FormatIntPtr(start), + reader.FormatIntPtr(start + size), + size) + print "Available memory regions:" + self.reader.ForEachMemoryRegion(print_region) + def do_s(self, word): """ Search for a given word in available memory regions. The given word @@ -1560,23 +1616,25 @@ class InspectionShell(cmd.Cmd): """ raise NotImplementedError - def do_list(self, smth): + def do_u(self, args): """ - List all available memory regions. + u 0x<address> 0x<size> + Unassemble memory in the region [address, address + size) """ - def print_region(reader, start, size, location): - print " %s - %s (%d bytes)" % (reader.FormatIntPtr(start), - reader.FormatIntPtr(start + size), - size) - print "Available memory regions:" - self.reader.ForEachMemoryRegion(print_region) - + args = args.split(' ') + start = int(args[0], 16) + size = int(args[1], 16) + lines = self.reader.GetDisasmLines(start, size) + for line in lines: + print FormatDisasmLine(start, self.heap, line) + print EIP_PROXIMITY = 64 CONTEXT_FOR_ARCH = { MD_CPU_ARCHITECTURE_AMD64: - ['rax', 'rbx', 'rcx', 'rdx', 'rdi', 'rsi', 'rbp', 'rsp', 'rip'], + ['rax', 'rbx', 'rcx', 'rdx', 'rdi', 'rsi', 'rbp', 'rsp', 'rip', + 'r8', 'r9', 'r10', 'r11', 'r12', 'r13', 'r14', 'r15'], MD_CPU_ARCHITECTURE_X86: ['eax', 'ebx', 'ecx', 'edx', 'edi', 'esi', 'ebp', 'esp', 'eip'] } |