From 4895ed1d10f48517c3edc4a713feb9950fa7d53d Mon Sep 17 00:00:00 2001 From: Marcos Henrich Date: Tue, 21 Jun 2016 11:20:26 +0100 Subject: [PATCH] [mono-symbolicate] Adds store-symbols mono-symbolicate can now be called: symbolicate store-symbols []+ This will store in all the managed symbols found in the provided directories. --- mcs/tools/mono-symbolicate/SymbolManager.cs | 31 +++++++++++++++++++++ mcs/tools/mono-symbolicate/symbolicate.cs | 25 ++++++++++++----- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/mcs/tools/mono-symbolicate/SymbolManager.cs b/mcs/tools/mono-symbolicate/SymbolManager.cs index a5410ed61c5..1d35a5ee3a0 100644 --- a/mcs/tools/mono-symbolicate/SymbolManager.cs +++ b/mcs/tools/mono-symbolicate/SymbolManager.cs @@ -76,5 +76,36 @@ namespace Mono return seqPointInfo; } + + public void StoreSymbols (params string[] lookupDirs) + { + foreach (var dir in lookupDirs) { + var exeFiles = Directory.GetFiles (dir, "*.exe"); + var dllFiles = Directory.GetFiles (dir, "*.dll"); + var assemblies = exeFiles.Concat (dllFiles); + foreach (var assemblyPath in assemblies) { + var mdbPath = assemblyPath + ".mdb"; + if (!File.Exists (mdbPath)) { + // assemblies without mdb files are useless + continue; + } + + var assembly = AssemblyDefinition.ReadAssembly (assemblyPath); + + var mvid = assembly.MainModule.Mvid.ToString ().ToUpper (); + var mvidDir = Path.Combine (msymDir, mvid); + + Directory.CreateDirectory (mvidDir); + + var mvidAssemblyPath = Path.Combine (mvidDir, Path.GetFileName (assemblyPath)); + File.Copy (assemblyPath, mvidAssemblyPath); + + var mvidMdbPath = Path.Combine (mvidDir, Path.GetFileName (mdbPath)); + File.Copy (mdbPath, mvidMdbPath); + + // TODO create MVID dir for non main modules with links to main module MVID + } + } + } } } diff --git a/mcs/tools/mono-symbolicate/symbolicate.cs b/mcs/tools/mono-symbolicate/symbolicate.cs index 487f1fd2045..3d358852447 100644 --- a/mcs/tools/mono-symbolicate/symbolicate.cs +++ b/mcs/tools/mono-symbolicate/symbolicate.cs @@ -11,19 +11,30 @@ namespace Mono { public static int Main (String[] args) { - if (args.Length < 2) { + if (args.Length != 2 && (args[0] == "store-symbols" && args.Length < 3)) { Console.Error.WriteLine ("Usage: symbolicate "); + Console.Error.WriteLine (" symbolicate store-symbols []+"); return 1; } - var msymDir = args [0]; - var inputFile = args [1]; + if (args[0] == "store-symbols") { + var msymDir = args[1]; + var lookupDirs = args.Skip (1).ToArray (); - var symbolManager = new SymbolManager (msymDir); + var symbolManager = new SymbolManager (msymDir); - using (StreamReader r = new StreamReader (inputFile)) { - var sb = Process (r, symbolManager); - Console.WriteLine (sb.ToString ()); + symbolManager.StoreSymbols (lookupDirs); + + } else { + var msymDir = args [0]; + var inputFile = args [1]; + + var symbolManager = new SymbolManager (msymDir); + + using (StreamReader r = new StreamReader (inputFile)) { + var sb = Process (r, symbolManager); + Console.Write (sb.ToString ()); + } } return 0; -- 2.25.1