Reviewers: Michael Starzinger,
Message:
PTAL.
Description:
Extend grokdump to show addresses of unavailable objects, and the reason why
they are unavailable.
Please review this at https://chromiumcodereview.appspot.com/10909113/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M tools/grokdump.py
Index: tools/grokdump.py
diff --git a/tools/grokdump.py b/tools/grokdump.py
index
5d9a053afde48af009121e67587b5d730856885f..f47bc532cd75da26a53f83ee7e2c34f4b6ef30ec
100755
--- a/tools/grokdump.py
+++ b/tools/grokdump.py
@@ -156,7 +156,7 @@ def FullDump(reader, heap):
heap_object = heap.FindObject(maybe_address)
print "%s: %s" % (reader.FormatIntPtr(slot),
reader.FormatIntPtr(maybe_address))
- if heap_object:
+ if heap_object.IsKnown():
heap_object.Print(Printer())
print
@@ -928,7 +928,7 @@ def AnnotateAddresses(heap, line):
for m in ADDRESS_RE.finditer(line):
maybe_address = int(m.group(0), 16)
object = heap.FindObject(maybe_address)
- if not object: continue
+ if not object.IsKnown(): continue
extra.append(str(object))
if len(extra) == 0: return line
return "%s ;; %s" % (line, ", ".join(extra))
@@ -959,6 +959,9 @@ class HeapObject(object):
assert (field_value & 1) == 0
return field_value / 2
+ def IsKnown(self):
+ return True
+
class Map(HeapObject):
def InstanceTypeOffset(self):
@@ -969,6 +972,20 @@ class Map(HeapObject):
self.instance_type = \
heap.reader.ReadU8(self.address + self.InstanceTypeOffset())
+class UnknownObject(object):
+ def __init__(self, reason, address):
+ self.address = address
+ self.reason = reason
+
+ def Print(self, p):
+ p.Print(str(self))
+
+ def __str__(self):
+ return "%s(%08x)" % (self.reason, self.address)
+
+ def IsKnown(self):
+ return False
+
class String(HeapObject):
def LengthOffset(self):
@@ -1311,22 +1328,27 @@ class V8Heap(object):
def FindObject(self, tagged_address):
if tagged_address in self.objects:
return self.objects[tagged_address]
- if (tagged_address & self.ObjectAlignmentMask()) != 1: return None
+ if (tagged_address & self.ObjectAlignmentMask()) != 1:
+ return UnknownObject("InvalidAlignment", tagged_address)
address = tagged_address - 1
- if not self.reader.IsValidAddress(address): return None
+ if not self.reader.IsValidAddress(address):
+ return UnknownObject("InvalidAddress", tagged_address)
map_tagged_address = self.reader.ReadUIntPtr(address)
if tagged_address == map_tagged_address:
# Meta map?
meta_map = Map(self, None, address)
instance_type_name = INSTANCE_TYPES.get(meta_map.instance_type)
- if instance_type_name != "MAP_TYPE": return None
+ if instance_type_name != "MAP_TYPE":
+ return UnknownObject("InvalidMapType", tagged_address)
meta_map.map = meta_map
object = meta_map
else:
map = self.FindMap(map_tagged_address)
- if map is None: return None
+ if map is None:
+ return UnknownObject("UnknownMap", address)
instance_type_name = INSTANCE_TYPES.get(map.instance_type)
- if instance_type_name is None: return None
+ if instance_type_name is None:
+ return UnknownObject("UnknownInstanceType", tagged_address)
cls = V8Heap.CLASS_MAP.get(instance_type_name, HeapObject)
object = cls(self, map, address)
self.objects[tagged_address] = object
@@ -1421,7 +1443,7 @@ class InspectionPadawan(object):
if known_map:
return known_map
found_obj = self.heap.FindObject(tagged_address)
- if found_obj: return found_obj
+ if found_obj.IsKnown(): return found_obj
address = tagged_address - 1
if self.reader.IsValidAddress(address):
map_tagged_address = self.reader.ReadUIntPtr(address)
@@ -1699,7 +1721,7 @@ def AnalyzeMinidump(options, minidump_name):
heap_object = heap.FindObject(maybe_address)
print "%s: %s" % (reader.FormatIntPtr(slot),
reader.FormatIntPtr(maybe_address))
- if heap_object:
+ if heap_object.IsKnown():
heap_object.Print(Printer())
print
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev