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 ()) {
52 StackFrameData sfData;
53 if (!linesEnded && StackFrameData.TryParse (line, out sfData)) {
54 stackFrames.Add (sfData);
60 if (stackFrames.Count > 0) {
62 StackTraceMetadata stMetadata;
63 if (StackTraceMetadata.TryParse (line, out stMetadata)) {
64 metadata.Add (stMetadata);
70 var aotidMetadata = metadata.FirstOrDefault ( m => m.Id == "AOTID" );
71 if (aotidMetadata != null)
72 aotid = aotidMetadata.Value;
74 var linesMvid = ProcessLinesMVID (metadata);
76 foreach (var sfData in stackFrames) {
78 if (linesMvid.ContainsKey (lineNumber))
79 mvid = linesMvid [lineNumber++];
81 symbolManager.TryResolveLocation (sfData, mvid, aotid);
83 sb.AppendLine (sfData.ToString ());
86 foreach (var m in metadata)
87 sb.AppendLine (m.Line);
89 // Clear lists for next stack trace
103 private static Dictionary<int, string> ProcessLinesMVID (List<StackTraceMetadata> metadata)
105 var linesMvid = new Dictionary<int, string> ();
106 var mvidData = metadata.Where ( m => m.Id == "MVID" ).Select ( m => m.Value );
107 foreach (var m in mvidData) {
108 var s1 = m.Split (new char[] {' '}, 2);
110 var lines = s1 [1].Split (',');
111 foreach (var line in lines)
112 linesMvid.Add (int.Parse (line), mvid);