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);
}
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);
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");
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;
}
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;
+ }
}
}