[mono-symbolicate] Fixes last stacktrace issue.
authorMarcos Henrich <marcos.henrich@xamarin.com>
Tue, 21 Jun 2016 10:32:16 +0000 (11:32 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Fri, 8 Jul 2016 21:40:38 +0000 (22:40 +0100)
Extracted Symbolicate.Process stacktrace dump logic into DumpStackTrace
method. Which can also be used to dump the last stack trace after the
process loop.

mcs/tools/mono-symbolicate/symbolicate.cs

index 3d358852447144453a7c0852843b4cccf5d79400..a99c9d01204b3c06e74e3862fbe88b2aa59bbb15 100644 (file)
@@ -48,44 +48,23 @@ namespace Mono
                        bool linesEnded = false;
 
                        for (var line = reader.ReadLine (); line != null; line = reader.ReadLine ()) {
-                                {
-                                       StackFrameData sfData;
-                                       if (!linesEnded && StackFrameData.TryParse (line, out sfData)) {
-                                               stackFrames.Add (sfData);
-                                               continue;
-                                       }
-                                       linesEnded = true;
-                               } 
+                               StackFrameData sfData;
+                               if (!linesEnded && StackFrameData.TryParse (line, out sfData)) {
+                                       stackFrames.Add (sfData);
+                                       continue;
+                               }
 
                                if (stackFrames.Count > 0) {
-                                       {
-                                               StackTraceMetadata stMetadata;
-                                               if (StackTraceMetadata.TryParse (line, out stMetadata)) {
-                                                       metadata.Add (stMetadata);
-                                                       continue;
-                                               }
-                                       }
-
-                                       string aotid = null;
-                                       var aotidMetadata = metadata.FirstOrDefault ( m => m.Id == "AOTID" );
-                                       if (aotidMetadata != null)
-                                               aotid = aotidMetadata.Value;
-
-                                       var linesMvid = ProcessLinesMVID (metadata);
-                                       var lineNumber = 0;
-                                       foreach (var sfData in stackFrames) {
-                                               string mvid = null;
-                                               if (linesMvid.ContainsKey (lineNumber))
-                                                       mvid = linesMvid [lineNumber++];
-
-                                               symbolManager.TryResolveLocation (sfData, mvid, aotid);
+                                       linesEnded = true;
 
-                                               sb.AppendLine (sfData.ToString ());
+                                       StackTraceMetadata stMetadata;
+                                       if (StackTraceMetadata.TryParse (line, out stMetadata)) {
+                                               metadata.Add (stMetadata);
+                                               continue;
                                        }
 
-                                       foreach (var m in metadata)
-                                               sb.AppendLine (m.Line);
-                                       
+                                       DumpStackTrace (symbolManager, sb, stackFrames, metadata);
+               
                                        // Clear lists for next stack trace
                                        stackFrames.Clear ();
                                        metadata.Clear ();
@@ -97,9 +76,35 @@ namespace Mono
                                sb.AppendLine (line);
                        }
 
+                       if (stackFrames.Count > 0)
+                               DumpStackTrace (symbolManager, sb, stackFrames, metadata);
+
                        return sb;
                }
 
+               private static void DumpStackTrace (SymbolManager symbolManager, StringBuilder sb, List<StackFrameData> stackFrames, List<StackTraceMetadata> metadata)
+               {
+                       string aotid = null;
+                       var aotidMetadata = metadata.FirstOrDefault ( m => m.Id == "AOTID" );
+                       if (aotidMetadata != null)
+                               aotid = aotidMetadata.Value;
+
+                       var linesMvid = ProcessLinesMVID (metadata);
+                       var lineNumber = 0;
+                       foreach (var sfData in stackFrames) {
+                               string mvid = null;
+                               if (linesMvid.ContainsKey (lineNumber))
+                                       mvid = linesMvid [lineNumber++];
+
+                               symbolManager.TryResolveLocation (sfData, mvid, aotid);
+
+                               sb.AppendLine (sfData.ToString ());
+                       }
+
+                       foreach (var m in metadata)
+                               sb.AppendLine (m.Line);
+               }
+
                private static Dictionary<int, string> ProcessLinesMVID (List<StackTraceMetadata> metadata)
                {
                        var linesMvid = new Dictionary<int, string> ();