summaryrefslogtreecommitdiff
path: root/deps/v8/tools/grokdump.py
diff options
context:
space:
mode:
authorisaacs <i@izs.me>2012-09-18 15:20:38 -0700
committerBert Belder <bertbelder@gmail.com>2012-09-21 01:52:24 +0200
commit3411a03dd114d635800cc50749d2351cd734eb2a (patch)
tree0ba1e52ab2236286894b33400302181ece91b63a /deps/v8/tools/grokdump.py
parentcc1b09d6b7c3cc6b8729804cbf644634ba5d0815 (diff)
downloadnode-new-3411a03dd114d635800cc50749d2351cd734eb2a.tar.gz
V8: Upgrade to 3.13.7.1
Diffstat (limited to 'deps/v8/tools/grokdump.py')
-rwxr-xr-xdeps/v8/tools/grokdump.py96
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']
}