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

Reply via email to