X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Ftools%2Fmono-symbolicate%2Fsymbolicate.cs;h=2c04a27eef04e84b37cd51a2b4b9b78a83be4358;hb=36d414542691e3903a43f92c1215e3c2efeb9ffe;hp=6479a48b8637c4fd6f8835c320ca27c168343b88;hpb=64b7e70f0d5f9ec7ae2b5c2b4ba4b51ed5f71d39;p=mono.git diff --git a/mcs/tools/mono-symbolicate/symbolicate.cs b/mcs/tools/mono-symbolicate/symbolicate.cs index 6479a48b863..2c04a27eef0 100644 --- a/mcs/tools/mono-symbolicate/symbolicate.cs +++ b/mcs/tools/mono-symbolicate/symbolicate.cs @@ -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 "); - Console.Error.WriteLine (" symbolicate store-symbols []+"); + Console.Error.WriteLine ("Usage: symbolicate [options] "); + Console.Error.WriteLine (" symbolicate [options] store-symbols []+"); 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 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 stackFrames = new List(); - List metadata = new List(); - 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 stackFrames, List metadata) + private static void StoreSymbolsAction (List 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 ProcessLinesMVID (List metadata) - { - var linesMvid = new Dictionary (); - 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); } } }