Merge pull request #3981 from kumpera/fix_symbolification_issues
authorRodrigo Kumpera <kumpera@users.noreply.github.com>
Tue, 20 Dec 2016 14:05:47 +0000 (12:05 -0200)
committerGitHub <noreply@github.com>
Tue, 20 Dec 2016 14:05:47 +0000 (12:05 -0200)
This PR adds runtime crash symbolification. It requires runtime and tooling changes.

mcs/tools/mono-symbolicate/LocationProvider.cs
mcs/tools/mono-symbolicate/StackFrameData.cs
mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs
mcs/tools/mono-symbolicate/Test/symbolicate.expected
mono/metadata/debug-helpers.c
mono/metadata/exception-internals.h
mono/metadata/icall.c
mono/metadata/mono-debug.c
mono/metadata/runtime.c
mono/metadata/runtime.h
mono/mini/mini-exceptions.c

index 68387807a59af2fcaad1ade75e0c9aa110343a84..f03adfdee58e7b86d9292f53eb28e1bcfdf4ee6f 100644 (file)
@@ -32,7 +32,12 @@ namespace Mono
                                return false;
 
                        TypeDefinition type = null;
-                       var nested = sfData.TypeFullName.Split ('+');
+                       string[] nested;
+                       if (sfData.TypeFullName.IndexOf ('/') >= 0)
+                                nested = sfData.TypeFullName.Split ('/');
+                       else
+                               nested = sfData.TypeFullName.Split ('+');
+
                        var types = assembly.MainModule.Types;
                        foreach (var ntype in nested) {
                                if (type == null) {
@@ -53,11 +58,16 @@ namespace Mono
                        var parensStart = sfData.MethodSignature.IndexOf ('(');
                        var methodName = sfData.MethodSignature.Substring (0, parensStart).TrimEnd ();
                        var methodParameters = sfData.MethodSignature.Substring (parensStart);
-                       var method = type.Methods.FirstOrDefault (m => CompareName (m, methodName) && CompareParameters (m.Parameters, methodParameters));
-                       if (method == null) {
+                       var methods = type.Methods.Where (m => CompareName (m, methodName) && CompareParameters (m.Parameters, methodParameters)).ToArray ();
+                       if (methods.Length == 0) {
                                logger.LogWarning ("Could not find method: {0}", methodName);
                                return false;
                        }
+                       if (methods.Length > 1) {
+                               logger.LogWarning ("Ambiguous match for method: {0}", sfData.MethodSignature);
+                               return false;
+                       }
+                       var method = methods [0];
 
                        int ilOffset;
                        if (sfData.IsILOffset) {
@@ -100,8 +110,11 @@ namespace Mono
 
                        if (!candidate.HasGenericParameters)
                                return false;
-                       
+
                        var genStart = expected.IndexOf ('[');
+                       if (genStart < 0)
+                               genStart = expected.IndexOf ('<');
+
                        if (genStart < 0)
                                return false;
 
@@ -117,6 +130,36 @@ namespace Mono
                        return candidate.GenericParameters.Count == arity;
                }
 
+               static string RemoveGenerics (string expected, char open, char close)
+               {
+                       if (expected.IndexOf (open) < 0)
+                               return expected;
+
+                       var sb = new StringBuilder ();
+                       for (int i = 0; i < expected.Length;) {
+                               int start = expected.IndexOf (open, i);
+                               int end = expected.IndexOf (close, i);
+                               if (start < 0 || end < 0) {
+                                       sb.Append (expected, i, expected.Length - i);
+                                       break;
+                               }
+
+                               bool is_ginst = false;
+                               for (int j = start + 1; j < end; ++j) {
+                                       if (expected [j] != ',')
+                                               is_ginst = true;
+                               }
+
+                               if (is_ginst) //discard the the generic args
+                                       sb.Append (expected, i, start - i);
+                               else //include array arity
+                                       sb.Append (expected, i, end + 1 - i);
+                               i = end + 1;
+
+                       }
+                       return sb.ToString ();
+               }
+
                static bool CompareParameters (Collection<ParameterDefinition> candidate, string expected)
                {
                        var builder = new StringBuilder ();
@@ -131,11 +174,6 @@ namespace Mono
                                        builder.Append ("...,");
 
                                var pt = parameter.ParameterType;
-                               if (!string.IsNullOrEmpty (pt.Namespace)) {
-                                       builder.Append (pt.Namespace);
-                                       builder.Append (".");
-                               }
-
                                FormatElementType (pt, builder);
 
                                builder.Append (" ");
@@ -144,7 +182,150 @@ namespace Mono
 
                        builder.Append (")");
 
-                       return builder.ToString () == expected;
+                       if (builder.ToString () == RemoveGenerics (expected, '[', ']'))
+                               return true;
+
+                       //now try the compact runtime format.
+
+                       builder.Clear ();
+
+                       builder.Append ("(");
+
+                       for (int i = 0; i < candidate.Count; i++) {
+                               var parameter = candidate [i];
+                               if (i > 0)
+                                       builder.Append (",");
+
+                               if (parameter.ParameterType.IsSentinel)
+                                       builder.Append ("...,");
+
+                               var pt = parameter.ParameterType;
+
+                               RuntimeFormatElementType (pt, builder);
+                       }
+
+                       builder.Append (")");
+
+                       if (builder.ToString () == RemoveGenerics (expected, '<', '>'))
+                               return true;
+                       return false;
+
+               }
+
+               static void RuntimeFormatElementType (TypeReference tr, StringBuilder builder)
+               {
+                       var ts = tr as TypeSpecification;
+                       if (ts != null) {
+                               if (ts.IsByReference) {
+                                       RuntimeFormatElementType (ts.ElementType, builder);
+                                       builder.Append ("&");
+                                       return;
+                               }
+                       }
+
+                       switch (tr.MetadataType) {
+                       case MetadataType.Void:
+                               builder.Append ("void");
+                               break;
+                       case MetadataType.Boolean:
+                               builder.Append ("bool");
+                               break;
+                       case MetadataType.Char:
+                               builder.Append ("char");
+                               break;
+                       case MetadataType.SByte:
+                               builder.Append ("sbyte");
+                               break;
+                       case MetadataType.Byte:
+                               builder.Append ("byte");
+                               break;
+                       case MetadataType.Int16:
+                               builder.Append ("int16");
+                               break;
+                       case MetadataType.UInt16:
+                               builder.Append ("uint16");
+                               break;
+                       case MetadataType.Int32:
+                               builder.Append ("int");
+                               break;
+                       case MetadataType.UInt32:
+                               builder.Append ("uint");
+                               break;
+                       case MetadataType.Int64:
+                               builder.Append ("long");
+                               break;
+                       case MetadataType.UInt64:
+                               builder.Append ("ulong");
+                               break;
+                       case MetadataType.Single:
+                               builder.Append ("single");
+                               break;
+                       case MetadataType.Double:
+                               builder.Append ("double");
+                               break;
+                       case MetadataType.String:
+                               builder.Append ("string");
+                               break;
+                       case MetadataType.Pointer:
+                               builder.Append (((TypeSpecification)tr).ElementType);
+                               builder.Append ("*");
+                               break;
+                       case MetadataType.ValueType:
+                       case MetadataType.Class:
+                       case MetadataType.GenericInstance: {
+                               FormatName (tr, builder, '/');
+                               break;
+                       }
+                       case MetadataType.Var:
+                       case MetadataType.MVar:
+                               builder.Append (tr.Name);
+                               builder.Append ("_REF");
+                               break;
+                       case MetadataType.Array: {
+                               var array = (ArrayType)tr;
+                               RuntimeFormatElementType (array.ElementType, builder);
+                               builder.Append ("[");
+
+                               for (int i = 0; i < array.Rank - 1; ++i)
+                                       builder.Append (",");
+
+                               builder.Append ("]");
+                               break;
+                       }
+
+                       case MetadataType.TypedByReference:
+                               builder.Append ("typedbyref");
+                               break;
+                       case MetadataType.IntPtr:
+                               builder.Append ("intptr");
+                               break;
+                       case MetadataType.UIntPtr:
+                               builder.Append ("uintptr");
+                               break;
+                       case MetadataType.FunctionPointer:
+                               builder.Append ("*()");
+                               break;
+                       case MetadataType.Object:
+                               builder.Append ("object");
+                               break;
+                       default:
+                               builder.Append ("-unknown-");
+                               break;
+                       }
+               }
+
+               static void FormatName (TypeReference tr, StringBuilder builder, char sep)
+               {
+                       if (tr.IsNested && !(tr.MetadataType == MetadataType.Var || tr.MetadataType == MetadataType.MVar)) {
+                               FormatName (tr.DeclaringType, builder, sep);
+                               builder.Append (sep);
+                       }
+                       if (!string.IsNullOrEmpty (tr.Namespace)) {
+                               builder.Append (tr.Namespace);
+                               builder.Append (".");
+                       }
+
+                       builder.Append (tr.Name);
                }
 
                static void FormatElementType (TypeReference tr, StringBuilder builder)
@@ -170,8 +351,7 @@ namespace Mono
                                        return;
                                }
                        }
-
-                       builder.Append (tr.Name);
+                       FormatName (tr, builder, '+');
                }
        }
 }
index 0177fcd61066a5b58b6370538c2a820450c20f19..646cf3a9a40c7137d4646542ebafd5813d8f8bc2 100644 (file)
@@ -84,7 +84,8 @@ namespace Mono
 
                        typeFullName = str.Substring (0, typeNameEnd);
                        // Remove generic parameters
-                       typeFullName = Regex.Replace (typeFullName, @"\[[^\[\]]*\]", "");
+                       typeFullName = Regex.Replace (typeFullName, @"\[[^\[\]]*\]$", "");
+                       typeFullName = Regex.Replace (typeFullName, @"\<[^\[\]]*\>$", "");
 
                        methodSignature = str.Substring (typeNameEnd + 1);
 
index 726997d21345d6c3b16ca9f8caf5353eb77e7429..c1a425afc46b73e96c74cd6a5efc0e3e063814a2 100644 (file)
@@ -47,10 +47,23 @@ class StackTraceDumper {
 
                Catch (() => InnerGenericClass<int>.InnerInnerGenericClass<string>.ThrowException ("Stack trace with 2 inner generic class and generic overload"));
 
+               Catch (() => InnerGenericClass<int>.ThrowException ("Stack trace with nested type argument", "string", null));
+
                Catch (() => {
                        var d = new Dictionary<string, string> ();
                        d.ContainsKey (null); // ArgumentNullException
                });
+
+               /*
+               The following test include ambiguous methods we can't resolve. Testing this is hard, so I'm leaving a test behind but disabling it for the time being
+               In this case the ambiguous methods are:
+                       public static void Foo<K> (int a, bool hard_crash, GenClass<T> arg, List<int> zz)
+                       public static void Foo<K> (int a, bool hard_crash, GenClass<T> arg, List<double> zz)
+
+               The are ambiguous because the only difference is the instantiation on the last parameter which we can't
+               figure out from a stacktrace.
+               */
+               //Catch (() => ComplicatedTestCase.Run ());
        }
 
        public static void Catch (Action action)
@@ -137,6 +150,11 @@ class StackTraceDumper {
                        throw new Exception (message);
                }
 
+               public static void ThrowException<T1> (string message, T1 arg, InnerGenericClass<T1> _ignore)
+               {
+                       throw new Exception (message as string);
+               }
+
                public class InnerInnerGenericClass<T2> {
                        public static void ThrowException (T message)
                        {
@@ -149,4 +167,41 @@ class StackTraceDumper {
                        }
                }
        }
+
+       class GenClass<T> {
+               public static void Foo (int a, bool hard_crash) {
+                       GenPair<T>.Foo<object> (a, hard_crash, new GenClass<T> (), new List<int> ());
+               }
+       }
+
+       class GenPair<T> {
+               public static void Foo<K> (int a, bool hard_crash, GenClass<T> arg, List<int> zz) {
+                       Foo<K,K,K> (a, hard_crash, null, null);
+               }
+
+               public static void Foo<K,J,F> (int a, bool hard_crash, GenClass<J> arg, List<int> zz) {
+                       Foo<double> (a, hard_crash, null, new List<double> ());
+               }
+
+               public static void Foo<K> (int a, bool hard_crash, GenClass<T> arg, List<double> zz) {
+                       ComplicatedTestCase.ArrayAndRef (a, new int[2], new int[2,2], ref hard_crash);
+               }
+       }
+
+       class ComplicatedTestCase {
+               public static int ArrayAndRef (int a, int[] b, int[,] c, ref bool hard_crash) {
+                       Object o = null;
+                       for (int x = 0; x < a; ++x)
+                               throw new Exception ("Stack trace with ambiguity");
+                       return 99;
+               }
+
+               public static void Foo (int a, bool hard_crash) {
+                       GenClass<string>.Foo (a, hard_crash);
+               }
+
+               public static void Run () {
+                       Foo (10, false);
+               }
+       }
 }
\ No newline at end of file
index 63da2bd7c90553e777af9d8d04c49459c73368d0..1ad44cec5ccaeb0d9f33a8a55cdbc81364810bda 100644 (file)
@@ -5,141 +5,150 @@ Stacktrace:
 
 System.Exception: Stacktrace with 2 frames
   at StackTraceDumper+<>c.<Main>b__0_0 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:16 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
   at StackTraceDumper+<>c.<Main>b__0_0 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:16 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stacktrace with 3 frames
-  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:83 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:96 
   at StackTraceDumper+<>c.<Main>b__0_1 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:18 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:83 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:96 
   at StackTraceDumper+<>c.<Main>b__0_1 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:18 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stacktrace with 4 frames
-  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:83 
-  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:81 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:96 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:94 
   at StackTraceDumper+<>c.<Main>b__0_2 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:20 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:83 
-  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:81 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:96 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32 i) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:94 
   at StackTraceDumper+<>c.<Main>b__0_2 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:20 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack frame with method overload using ref parameter
-  at StackTraceDumper.ThrowException (System.String& message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:75 
+  at StackTraceDumper.ThrowException (System.String& message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:88 
   at StackTraceDumper+<>c.<Main>b__0_3 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:24 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowException (System.String& message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:75 
+  at StackTraceDumper.ThrowException (System.String& message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:88 
   at StackTraceDumper+<>c.<Main>b__0_3 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:24 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack frame with method overload using out parameter
-  at StackTraceDumper.ThrowException (System.String message, System.Int32& o) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:88 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32& o) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:101 
   at StackTraceDumper+<>c.<Main>b__0_4 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:29 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowException (System.String message, System.Int32& o) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:88 
+  at StackTraceDumper.ThrowException (System.String message, System.Int32& o) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:101 
   at StackTraceDumper+<>c.<Main>b__0_4 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:29 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack frame with 1 generic parameter
-  at StackTraceDumper.ThrowExceptionGeneric[T] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:93 
+  at StackTraceDumper.ThrowExceptionGeneric[T] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:106 
   at StackTraceDumper+<>c.<Main>b__0_5 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:32 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowExceptionGeneric[T] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:93 
+  at StackTraceDumper.ThrowExceptionGeneric[T] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:106 
   at StackTraceDumper+<>c.<Main>b__0_5 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:32 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack frame with 2 generic parameters
-  at StackTraceDumper.ThrowExceptionGeneric[T1,T2] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:113 
+  at StackTraceDumper.ThrowExceptionGeneric[T1,T2] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:126 
   at StackTraceDumper+<>c.<Main>b__0_6 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:34 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowExceptionGeneric[T1,T2] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:113 
+  at StackTraceDumper.ThrowExceptionGeneric[T1,T2] (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:126 
   at StackTraceDumper+<>c.<Main>b__0_6 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:34 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack frame with generic method overload
-  at StackTraceDumper.ThrowExceptionGeneric[T] (T a1) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:98 
+  at StackTraceDumper.ThrowExceptionGeneric[T] (T a1) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:111 
   at StackTraceDumper+<>c.<Main>b__0_7 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:36 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper.ThrowExceptionGeneric[T] (T a1) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:98 
+  at StackTraceDumper.ThrowExceptionGeneric[T] (T a1) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:111 
   at StackTraceDumper+<>c.<Main>b__0_7 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:36 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack trace with inner class
-  at StackTraceDumper+InnerClass.ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:119 
+  at StackTraceDumper+InnerClass.ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:132 
   at StackTraceDumper+<>c.<Main>b__0_8 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:38 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper+InnerClass.ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:119 
+  at StackTraceDumper+InnerClass.ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:132 
   at StackTraceDumper+<>c.<Main>b__0_8 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:38 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack trace with inner generic class
-  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:126 
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:139 
   at StackTraceDumper+<>c.<Main>b__0_9 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:40 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:126 
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:139 
   at StackTraceDumper+<>c.<Main>b__0_9 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:40 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Generic to string:string
 
 System.Exception: Stack trace with inner generic class and method generic parameter
-  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message, T arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:132 
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message, T arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:145 
   at StackTraceDumper+<>c.<Main>b__0_10 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:42 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message, T arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:132 
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException (System.String message, T arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:145 
   at StackTraceDumper+<>c.<Main>b__0_10 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:42 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack trace with inner generic class and generic overload
-  at StackTraceDumper+InnerGenericClass`1[T].ThrowException[T1] (System.String message, T1 arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:137 
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException[T1] (System.String message, T1 arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:150 
   at StackTraceDumper+<>c.<Main>b__0_11 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:44 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper+InnerGenericClass`1[T].ThrowException[T1] (System.String message, T1 arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:137 
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException[T1] (System.String message, T1 arg) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:150 
   at StackTraceDumper+<>c.<Main>b__0_11 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:44 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack trace with 2 inner generic class and generic overload
-  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:143 
+  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:161 
   at StackTraceDumper+<>c.<Main>b__0_12 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:46 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:143 
+  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:161 
   at StackTraceDumper+<>c.<Main>b__0_12 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:46 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.Exception: Stack trace with 2 inner generic class and generic overload
-  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T2 message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:148 
+  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T2 message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:166 
   at StackTraceDumper+<>c.<Main>b__0_13 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:48 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
-  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T2 message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:148 
+  at StackTraceDumper+InnerGenericClass`1+InnerInnerGenericClass`1[T,T2].ThrowException (T2 message) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:166 
   at StackTraceDumper+<>c.<Main>b__0_13 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:48 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
+
+System.Exception: Stack trace with nested type argument
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException[T1] (System.String message, T1 arg, StackTraceDumper+InnerGenericClass`1[T] _ignore) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:155 
+  at StackTraceDumper+<>c.<Main>b__0_14 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:50 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
+Stacktrace:
+  at StackTraceDumper+InnerGenericClass`1[T].ThrowException[T1] (System.String message, T1 arg, StackTraceDumper+InnerGenericClass`1[T] _ignore) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:155 
+  at StackTraceDumper+<>c.<Main>b__0_14 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:50 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 
 System.ArgumentNullException: Value cannot be null.
 Parameter name: key
   at System.ThrowHelper.ThrowArgumentNullException (System.ExceptionArgument argument) in mcs/class/referencesource/mscorlib/system/throwhelper.cs:80 
   at System.Collections.Generic.Dictionary`2[TKey,TValue].FindEntry (TKey key) in mcs/class/referencesource/mscorlib/system/collections/generic/dictionary.cs:299 
   at System.Collections.Generic.Dictionary`2[TKey,TValue].ContainsKey (TKey key) in mcs/class/referencesource/mscorlib/system/collections/generic/dictionary.cs:228 
-  at StackTraceDumper+<>c.<Main>b__0_14 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:52 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper+<>c.<Main>b__0_15 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:54 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
 Stacktrace:
   at System.ThrowHelper.ThrowArgumentNullException (System.ExceptionArgument argument) in mcs/class/referencesource/mscorlib/system/throwhelper.cs:80 
   at System.Collections.Generic.Dictionary`2[TKey,TValue].FindEntry (TKey key) in mcs/class/referencesource/mscorlib/system/collections/generic/dictionary.cs:299 
   at System.Collections.Generic.Dictionary`2[TKey,TValue].ContainsKey (TKey key) in mcs/class/referencesource/mscorlib/system/collections/generic/dictionary.cs:228 
-  at StackTraceDumper+<>c.<Main>b__0_14 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:52 
-  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:59 
+  at StackTraceDumper+<>c.<Main>b__0_15 () in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:54 
+  at StackTraceDumper.Catch (System.Action action) in mcs/tools/mono-symbolicate/Test/StackTraceDumper.cs:72 
index 449895a56106a2a0e3efbbc97230cd3bfe938712..d0937fdf70af561b9dcd6d9653a953f985b5a5d8 100644 (file)
@@ -163,7 +163,10 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace)
                break;
        case MONO_TYPE_ARRAY:
                mono_type_get_desc (res, &type->data.array->eklass->byval_arg, include_namespace);
-               g_string_append_printf (res, "[%d]", type->data.array->rank);
+               g_string_append_c (res, '[');
+               for (i = 1; i < type->data.array->rank; ++i)
+                       g_string_append_c (res, ',');
+               g_string_append_c (res, ']');
                break;
        case MONO_TYPE_SZARRAY:
                mono_type_get_desc (res, &type->data.klass->byval_arg, include_namespace);
index a0f4c783fa14e47ff5a49488fb543101598877f0..e36e5ef9e76a2de9ea91a20b9e4bd59a6b1472ce 100644 (file)
@@ -26,4 +26,10 @@ mono_exception_from_token_two_strings_checked (MonoImage *image, uint32_t token,
                                               MonoString *a1, MonoString *a2,
                                               MonoError *error);
 
+
+typedef int (*MonoGetSeqPointFunc) (MonoDomain *domain, MonoMethod *method, gint32 native_offset);
+
+void
+mono_install_get_seq_point (MonoGetSeqPointFunc func);
+
 #endif
index c11cbad5228e833d6935dcbffadc44d654e27973..753cd28950f8eb9e2d320efd56d59b423b3fe08e 100644 (file)
@@ -4688,23 +4688,10 @@ fail:
 ICALL_EXPORT MonoStringHandle
 ves_icall_System_Reflection_Assembly_GetAotId (MonoError *error)
 {
-       int i;
-       guint8 aotid_sum = 0;
-       MonoDomain* domain = mono_domain_get ();
-
-       if (!domain->entry_assembly || !domain->entry_assembly->image)
-               return NULL;
-
-       guint8 (*aotid)[16] = &domain->entry_assembly->image->aotid;
-
-       for (i = 0; i < 16; ++i)
-               aotid_sum |= (*aotid)[i];
-
-       if (aotid_sum == 0)
+       char *guid = mono_runtime_get_aotid ();
+       if (guid == NULL)
                return NULL;
-
-       gchar *guid = mono_guid_to_string((guint8*) aotid);
-       MonoStringHandle res = mono_string_new_handle (domain, guid, error);
+       MonoStringHandle res = mono_string_new_handle (mono_domain_get (), guid, error);
        g_free (guid);
        return res;
 }
index b139ce9f3e6ef944249972c2acff47bc8d3bf4c7..4d81eefb8d1edac18babde7a684dfb89878da7e5 100644 (file)
@@ -22,6 +22,8 @@
 #include <mono/metadata/gc-internals.h>
 #include <mono/metadata/mempool.h>
 #include <mono/metadata/debug-mono-ppdb.h>
+#include <mono/metadata/exception-internals.h>
+#include <mono/metadata/runtime.h>
 #include <string.h>
 
 #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
@@ -861,6 +863,14 @@ mono_debug_free_source_location (MonoDebugSourceLocation *location)
        }
 }
 
+static int (*get_seq_point) (MonoDomain *domain, MonoMethod *method, gint32 native_offset);
+
+void
+mono_install_get_seq_point (MonoGetSeqPointFunc func)
+{
+       get_seq_point = func;
+}
+
 /**
  * mono_debug_print_stack_frame:
  * @native_offset: Native offset within the @method's machine code.
@@ -891,10 +901,22 @@ mono_debug_print_stack_frame (MonoMethod *method, guint32 native_offset, MonoDom
                        offset = -1;
                }
 
+               if (offset < 0 && get_seq_point)
+                       offset = get_seq_point (domain, method, native_offset);
+
                if (offset < 0)
                        res = g_strdup_printf ("at %s <0x%05x>", fname, native_offset);
-               else
-                       res = g_strdup_printf ("at %s <IL 0x%05x, 0x%05x>", fname, offset, native_offset);
+               else {
+                       char *mvid = mono_guid_to_string_minimal ((uint8_t*)method->klass->image->heap_guid.data);
+                       char *aotid = mono_runtime_get_aotid ();
+                       if (aotid)
+                               res = g_strdup_printf ("at %s [0x%05x] in <%s#%s>:0" , fname, offset, mvid, aotid);
+                       else
+                               res = g_strdup_printf ("at %s [0x%05x] in <%s>:0" , fname, offset, mvid);
+
+                       g_free (aotid);
+                       g_free (mvid);
+               }
                g_free (fname);
                return res;
        }
index d2928e9306a44bf34ecfa4e95b7566e4db59892a..4e6e08c2b3ec778a3842f87c84dc773d984bf343 100644 (file)
@@ -139,3 +139,24 @@ mono_runtime_init_tls (void)
 {
        mono_marshal_init_tls ();
 }
+
+char*
+mono_runtime_get_aotid (void)
+{
+       int i;
+       guint8 aotid_sum = 0;
+       MonoDomain* domain = mono_domain_get ();
+
+       if (!domain->entry_assembly || !domain->entry_assembly->image)
+               return NULL;
+
+       guint8 (*aotid)[16] = &domain->entry_assembly->image->aotid;
+
+       for (i = 0; i < 16; ++i)
+               aotid_sum |= (*aotid)[i];
+
+       if (aotid_sum == 0)
+               return NULL;
+
+       return mono_guid_to_string ((guint8*) aotid);
+}
\ No newline at end of file
index ef14453ceb2249c1ac92689daadaa7a9695ec617..65cb5daa4a511e4f33a9eb0e03567b76cdd056d2 100644 (file)
@@ -21,6 +21,8 @@ gboolean mono_runtime_is_critical_method (MonoMethod *method);
 gboolean mono_runtime_try_shutdown (void);
 
 void mono_runtime_init_tls (void);
+
+char* mono_runtime_get_aotid (void);
 MONO_END_DECLS
 
 #endif /* _MONO_METADATA_RUNTIME_H_ */
index 757cf56dff6f3baa2be362bd5973c0685c326d1f..cc3aed0892131a509a111f14feba6d4dc3dfbe99 100644 (file)
@@ -180,6 +180,15 @@ mini_above_abort_threshold (void)
        return above_threshold;
 }
 
+static int
+mono_get_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset)
+{
+       SeqPoint sp;
+       if (mono_find_prev_seq_point_for_native_offset (domain, method, native_offset, NULL, &sp))
+               return sp.il_offset;
+       return -1;
+}
+
 void
 mono_exceptions_init (void)
 {
@@ -225,6 +234,7 @@ mono_exceptions_init (void)
        cbs.mono_clear_abort_threshold = mini_clear_abort_threshold;
        cbs.mono_above_abort_threshold = mini_above_abort_threshold;
        mono_install_eh_callbacks (&cbs);
+       mono_install_get_seq_point (mono_get_seq_point_for_native_offset);
 }
 
 gpointer