[msvc] Update csproj files (#4074)
[mono.git] / mcs / tools / mono-symbolicate / symbolicate.cs
index 6479a48b8637c4fd6f8835c320ca27c168343b88..2c04a27eef04e84b37cd51a2b4b9b78a83be4358 100644 (file)
@@ -23,6 +23,8 @@ namespace Mono
                        }
                }
 
+               static Logger logger;
+
                public static int Main (String[] args)
                {
                        var showHelp = false;
@@ -30,17 +32,12 @@ namespace Mono
 
                        Command cmd = null;
 
-                       if (args[0] == "store-symbols")
-                               cmd = new Command (StoreSymbolsAction, 2);
-
-                       if (cmd != null) {
-                               args = args.Skip (1).ToArray ();
-                       } else {
-                               cmd = new Command (SymbolicateAction, 2, 2);
-                       }
+                       var logLevel = Logger.Level.Warning;
 
                        var options = new OptionSet {
                                { "h|help", "Show this help", v => showHelp = true },
+                               { "q", "Quiet, warnings are not displayed", v => logLevel = Logger.Level.Error },
+                               { "v", "Verbose, log debug messages", v => logLevel = Logger.Level.Debug },
                        };
 
                        try {
@@ -50,15 +47,26 @@ namespace Mono
                                showHelp = true;
                        }
 
+                       if (extra.Count > 0 && extra[0] == "store-symbols")
+                               cmd = new Command (StoreSymbolsAction, 2);
+
+                       if (cmd != null) {
+                               extra.RemoveAt (0);
+                       } else {
+                               cmd = new Command (SymbolicateAction, 2, 2);
+                       }
+
                        if (showHelp || extra == null || extra.Count < cmd.MinArgCount || extra.Count > cmd.MaxArgCount) {
-                               Console.Error.WriteLine ("Usage: symbolicate <msym dir> <input file>");
-                               Console.Error.WriteLine ("       symbolicate store-symbols <msym dir> [<dir>]+");
+                               Console.Error.WriteLine ("Usage: symbolicate [options] <msym dir> <input file>");
+                               Console.Error.WriteLine ("       symbolicate [options] store-symbols <msym dir> [<dir>]+");
                                Console.WriteLine ();
                                Console.WriteLine ("Available options:");
                                options.WriteOptionDescriptions (Console.Out);
                                return 1;
                        }
 
+                       logger = new Logger (logLevel, msg => Console.Error.WriteLine (msg));
+
                        cmd.Action (extra);
 
                        return 0;
@@ -69,102 +77,30 @@ namespace Mono
                        var msymDir = args [0];
                        var inputFile = args [1];
 
-                       var symbolManager = new SymbolManager (msymDir);
+                       var symbolManager = new SymbolManager (msymDir, logger);
 
                        using (StreamReader r = new StreamReader (inputFile)) {
-                               var sb = Process (r, symbolManager);
-                               Console.Write (sb.ToString ());
-                       }
-               }
-
-               private static void StoreSymbolsAction (List<string> args)
-               {
-                       var msymDir = args[0];
-                       var lookupDirs = args.Skip (1).ToArray ();
-
-                       var symbolManager = new SymbolManager (msymDir);
-
-                       symbolManager.StoreSymbols (lookupDirs);
-               }
-
-               public static StringBuilder Process (StreamReader reader, SymbolManager symbolManager)
-               {
-                       List<StackFrameData> stackFrames = new List<StackFrameData>();
-                       List<StackTraceMetadata> metadata = new List<StackTraceMetadata>();
-                       StringBuilder sb = new StringBuilder ();
-                       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;
-                               }
-
-                               if (stackFrames.Count > 0) {
-                                       linesEnded = true;
-
-                                       StackTraceMetadata stMetadata;
-                                       if (StackTraceMetadata.TryParse (line, out stMetadata)) {
-                                               metadata.Add (stMetadata);
+                               for (var line = r.ReadLine (); line != null; line = r.ReadLine ()) {
+                                       StackFrameData sfData;
+                                       if (StackFrameData.TryParse (line, out sfData) &&
+                                               symbolManager.TryResolveLocation (sfData)) {
+                                               Console.WriteLine (sfData.ToString ());
                                                continue;
                                        }
 
-                                       DumpStackTrace (symbolManager, sb, stackFrames, metadata);
-               
-                                       // Clear lists for next stack trace
-                                       stackFrames.Clear ();
-                                       metadata.Clear ();
+                                       Console.WriteLine (line);
                                }
-
-                               linesEnded = false;
-
-                               // Append last line
-                               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)
+               private static void StoreSymbolsAction (List<string> args)
                {
-                       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);
-               }
+                       var msymDir = args[0];
+                       var lookupDirs = args.Skip (1).ToArray ();
 
-               private static Dictionary<int, string> ProcessLinesMVID (List<StackTraceMetadata> metadata)
-               {
-                       var linesMvid = new Dictionary<int, string> ();
-                       var mvidData = metadata.Where ( m => m.Id == "MVID" ).Select ( m => m.Value );
-                       foreach (var m in mvidData) {
-                               var s1 = m.Split (new char[] {' '}, 2);
-                               var mvid = s1 [0];
-                               var lines = s1 [1].Split (',');
-                               foreach (var line in lines)
-                                       linesMvid.Add (int.Parse (line), mvid);
-                       }
+                       var symbolManager = new SymbolManager (msymDir, logger);
 
-                       return linesMvid;
+                       symbolManager.StoreSymbols (lookupDirs);
                }
        }
 }