Merge pull request #167 from konrad-kruczynski/send_async_fix
[mono.git] / data / gdb / mono-gdb.py
index fc101f122f9ec0d56f2b588fdf00fc4bd3a2a959..c8d921ebd38f38b131697686d2e48c770fa7bf50 100644 (file)
@@ -103,8 +103,11 @@ class ObjectPrinter:
             class_name = obj ['vtable'].dereference ()['klass'].dereference ()['name'].string ()
             if class_name [-2:len(class_name)] == "[]":
                 return {}.__iter__ ()
-            gdb_type = gdb.lookup_type ("struct %s_%s" % (class_ns.replace (".", "_"), class_name))
-            return self._iterator(obj.cast (gdb_type))
+            try:
+                gdb_type = gdb.lookup_type ("struct %s_%s" % (class_ns.replace (".", "_"), class_name))
+                return self._iterator(obj.cast (gdb_type))
+            except:
+                return {}.__iter__ ()
         except:
             print sys.exc_info ()[0]
             print sys.exc_info ()[1]
@@ -163,6 +166,8 @@ class MonoClassPrinter:
             return "0x0"
         klass = self.val.dereference ()
         class_name = stringify_class_name (klass ["name_space"].string (), klass ["name"].string ())
+        if klass ["generic_class"].cast (gdb.lookup_type ("guint64")) != 0:
+            class_name = "%s<%s>" % (class_name, str (klass ["generic_class"]["context"]["class_inst"]))
         if add_quotes:
             return "\"%s\"" % (class_name)
         else:
@@ -185,6 +190,8 @@ class MonoGenericInstPrinter:
         self.val = val
 
     def to_string(self):
+        if int(self.val.cast (gdb.lookup_type ("guint64"))) == 0:
+            return "0x0"
         inst = self.val.dereference ()
         inst_len = inst ["type_argc"]
         inst_args = inst ["type_argv"]
@@ -277,6 +284,21 @@ class MonoMethodRgctxPrinter:
             inst_str = inst_str + type_printer.to_string ()
         return "MRGCTX[%s, [%s]]" % (klass_printer.to_string(), inst_str)
 
+class MonoVTablePrinter:
+    "Print a MonoVTable structure"
+
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        if int(self.val.cast (gdb.lookup_type ("guint64"))) == 0:
+            return "0x0"
+        vtable = self.val.dereference ()
+        klass = vtable ["klass"]
+        klass_printer = MonoClassPrinter (klass)
+
+        return "vtable(%s)" % (klass_printer.to_string ())
+
 def lookup_pretty_printer(val):
     t = str (val.type)
     if t == "object":
@@ -285,6 +307,8 @@ def lookup_pretty_printer(val):
         return ObjectPrinter (val)    
     if t == "string":
         return StringPrinter (val)
+    if t == "MonoString *":
+        return StringPrinter (val)
     if t == "MonoMethod *":
         return MonoMethodPrinter (val)
     if t == "MonoClass *":
@@ -297,6 +321,8 @@ def lookup_pretty_printer(val):
         return MonoGenericClassPrinter (val)
     if t == "MonoMethodRuntimeGenericContext *":
         return MonoMethodRgctxPrinter (val)
+    if t == "MonoVTable *":
+        return MonoVTablePrinter (val)
     return None
 
 def register_csharp_printers(obj):