[mono-symbolicate] Adds store-symbols
authorMarcos Henrich <marcos.henrich@xamarin.com>
Tue, 21 Jun 2016 10:20:26 +0000 (11:20 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Fri, 8 Jul 2016 21:40:38 +0000 (22:40 +0100)
mono-symbolicate can now be called:
   symbolicate store-symbols <msym dir> [<dir>]+

This will store in <msym dir> all the managed symbols found in the
provided directories.

mcs/tools/mono-symbolicate/SymbolManager.cs
mcs/tools/mono-symbolicate/symbolicate.cs

index a5410ed61c52a9c1f2a296f71ef62a574820c1bb..1d35a5ee3a0b45638e03ffb6706147d0eb0eb756 100644 (file)
@@ -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
+                               }
+                       }
+               }
        }
 }
index 487f1fd2045092b525839e86dc8bf7ae5ccea594..3d358852447144453a7c0852843b4cccf5d79400 100644 (file)
@@ -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 <msym dir> <input file>");
+                               Console.Error.WriteLine ("       symbolicate store-symbols <msym dir> [<dir>]+");
                                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;