5 using System.Collections.Generic;
6 using System.Globalization;
10 public class Symbolicate
12 public static int Main (String[] args)
14 if (args.Length != 2 && (args[0] == "store-symbols" && args.Length < 3)) {
15 Console.Error.WriteLine ("Usage: symbolicate <msym dir> <input file>");
16 Console.Error.WriteLine (" symbolicate store-symbols <msym dir> [<dir>]+");
20 if (args[0] == "store-symbols") {
21 var msymDir = args[1];
22 var lookupDirs = args.Skip (1).ToArray ();
24 var symbolManager = new SymbolManager (msymDir);
26 symbolManager.StoreSymbols (lookupDirs);
29 var msymDir = args [0];
30 var inputFile = args [1];
32 var symbolManager = new SymbolManager (msymDir);
34 using (StreamReader r = new StreamReader (inputFile)) {
35 var sb = Process (r, symbolManager);
36 Console.Write (sb.ToString ());
43 public static StringBuilder Process (StreamReader reader, SymbolManager symbolManager)
45 List<StackFrameData> stackFrames = new List<StackFrameData>();
46 List<StackTraceMetadata> metadata = new List<StackTraceMetadata>();
47 StringBuilder sb = new StringBuilder ();
48 bool linesEnded = false;
50 for (var line = reader.ReadLine (); line != null; line = reader.ReadLine ()) {
51 StackFrameData sfData;
52 if (!linesEnded && StackFrameData.TryParse (line, out sfData)) {
53 stackFrames.Add (sfData);
57 if (stackFrames.Count > 0) {
60 StackTraceMetadata stMetadata;
61 if (StackTraceMetadata.TryParse (line, out stMetadata)) {
62 metadata.Add (stMetadata);
66 DumpStackTrace (symbolManager, sb, stackFrames, metadata);
68 // Clear lists for next stack trace
79 if (stackFrames.Count > 0)
80 DumpStackTrace (symbolManager, sb, stackFrames, metadata);
85 private static void DumpStackTrace (SymbolManager symbolManager, StringBuilder sb, List<StackFrameData> stackFrames, List<StackTraceMetadata> metadata)
88 var aotidMetadata = metadata.FirstOrDefault ( m => m.Id == "AOTID" );
89 if (aotidMetadata != null)
90 aotid = aotidMetadata.Value;
92 var linesMvid = ProcessLinesMVID (metadata);
94 foreach (var sfData in stackFrames) {
96 if (linesMvid.ContainsKey (lineNumber))
97 mvid = linesMvid [lineNumber++];
99 symbolManager.TryResolveLocation (sfData, mvid, aotid);
101 sb.AppendLine (sfData.ToString ());
104 foreach (var m in metadata)
105 sb.AppendLine (m.Line);
108 private static Dictionary<int, string> ProcessLinesMVID (List<StackTraceMetadata> metadata)
110 var linesMvid = new Dictionary<int, string> ();
111 var mvidData = metadata.Where ( m => m.Id == "MVID" ).Select ( m => m.Value );
112 foreach (var m in mvidData) {
113 var s1 = m.Split (new char[] {' '}, 2);
115 var lines = s1 [1].Split (',');
116 foreach (var line in lines)
117 linesMvid.Add (int.Parse (line), mvid);