Merge pull request #4708 from xmcclure/orbis-system-net
[mono.git] / mcs / tools / mono-symbolicate / SymbolManager.cs
index 466f18dc68c82b4bf4fb2d48bd51b7d7faae5540..a204788306bb274ca648c24aca209d39d34fac60 100644 (file)
@@ -12,18 +12,25 @@ namespace Mono
        public class SymbolManager
        {
                string msymDir;
+               Logger logger;
 
-               public SymbolManager (string msymDir) {
+               public SymbolManager (string msymDir, Logger logger) {
                        this.msymDir = msymDir;
+                       this.logger = logger;
                }
 
-               internal bool TryResolveLocation (StackFrameData sfData, string mvid, string aotid)
+               internal bool TryResolveLocation (StackFrameData sfData)
                {
-                       var assemblyLocProvider = GetOrCreateAssemblyLocationProvider (mvid);
+                       if (sfData.Mvid == null)
+                               return false;
+
+                       var assemblyLocProvider = GetOrCreateAssemblyLocationProvider (sfData.Mvid);
+                       if (assemblyLocProvider == null)
+                               return false;
 
                        SeqPointInfo seqPointInfo = null;
-                       if (!sfData.IsILOffset && aotid != null)
-                               seqPointInfo = GetOrCreateSeqPointInfo (aotid);
+                       if (!sfData.IsILOffset && sfData.Aotid != null)
+                               seqPointInfo = GetOrCreateSeqPointInfo (sfData.Aotid);
 
                        return assemblyLocProvider.TryResolveLocation (sfData, seqPointInfo);
                }
@@ -36,19 +43,23 @@ namespace Mono
                                return assemblies[mvid];
 
                        var mvidDir = Path.Combine (msymDir, mvid);
-                       if (!Directory.Exists (mvidDir))
-                               throw new Exception (string.Format("MVID directory does not exist: {0}", mvidDir));
+                       if (!Directory.Exists (mvidDir)) {
+                               logger.LogWarning ("MVID directory does not exist: {0}", mvidDir);
+                               return  null;
+                       }
 
                        string assemblyPath = null;
                        var exeFiles = Directory.GetFiles (mvidDir, "*.exe");
                        var dllFiles = Directory.GetFiles (mvidDir, "*.dll");
 
-                       if (exeFiles.Length + dllFiles.Length != 1)
-                               throw new Exception (string.Format ("MVID directory should include one assembly: {0}", mvidDir));
+                       if (exeFiles.Length + dllFiles.Length != 1) {
+                               logger.LogError ("MVID directory should include one assembly: {0}", mvidDir);
+                               return null;
+                       }
 
-                       assemblyPath = (exeFiles.Length > 0)? exeFiles[0] : dllFiles[0];
+                       assemblyPath = exeFiles.Length > 0 ? exeFiles[0] : dllFiles[0];
 
-                       var locProvider = new AssemblyLocationProvider (assemblyPath);
+                       var locProvider = new AssemblyLocationProvider (assemblyPath, logger);
 
                        assemblies.Add (mvid, locProvider);
 
@@ -63,8 +74,10 @@ namespace Mono
                                return seqPointInfos[aotid];
 
                        var aotidDir = Path.Combine (msymDir, aotid);
-                       if (!Directory.Exists (aotidDir))
-                               throw new Exception (string.Format("AOTID directory does not exist: {0}", aotidDir));
+                       if (!Directory.Exists (aotidDir)) {
+                               logger.LogError ("AOTID directory does not exist: {0}", aotidDir);
+                               return null;
+                       }
 
                        string msymFile = null;
                        var msymFiles = Directory.GetFiles(aotidDir, "*.msym");
@@ -84,9 +97,13 @@ namespace Mono
                                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
+
+                                       // TODO: Ignore embedded pdb
+                                       var symbolFile = GetSymbolFile (assemblyPath);
+
+                                       if (symbolFile == null) {
+                                               logger.LogWarning ("Directory {0} contains {1} but no debug symbols file was found.", dir, Path.GetFileName (assemblyPath));
+                                               // assemblies without debug symbols are useless
                                                continue;
                                        }
 
@@ -95,17 +112,37 @@ namespace Mono
                                        var mvid = assembly.MainModule.Mvid.ToString ("N");
                                        var mvidDir = Path.Combine (msymDir, mvid);
 
+                                       if (Directory.Exists (mvidDir)) {
+                                               try {
+                                                       Directory.Delete (mvidDir, true);
+                                               } catch (DirectoryNotFoundException) {}
+                                       }
+
                                        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);
+                                       var mvidDebugPath = Path.Combine (mvidDir, Path.GetFileName (symbolFile));
+                                       File.Copy (symbolFile, mvidDebugPath);
 
                                        // TODO create MVID dir for non main modules with links to main module MVID
                                }
                        }
                }
+
+               static string GetSymbolFile (string assembly)
+               {
+                       var pdbName = Path.ChangeExtension (assembly, "pdb");
+                       if (File.Exists (pdbName))
+                               return pdbName;
+                       
+                       var mdbName = assembly + ".mdb";
+
+                       if (File.Exists (mdbName))
+                               return mdbName;
+
+                       return null;
+               }
        }
 }