public ILAssembly(Stack <ILAssembly> allAssemblies, string binaryPath, bool loadReferences, DefaultAssemblyResolver assemblyResolver) { allAssemblies.Push(this); // check if core lib string libName = Path.GetFileNameWithoutExtension(binaryPath); isCoreLib = libName == "mscorlib" || //libName == "System.Runtime" || libName == "System.Private.CoreLib" || libName == "netstandard" || (TypeSystem.CustomCoreLibName != null && libName == TypeSystem.CustomCoreLibName); // create reader parameters desc var readerParameters = new ReaderParameters(); readerParameters.AssemblyResolver = assemblyResolver; // check if debug symbol file is avaliable var pdbReaderProvider = new PdbReaderProvider(); string symbolsPath = Path.Combine(Path.GetDirectoryName(binaryPath), Path.GetFileNameWithoutExtension(binaryPath) + ".pdb"); if (File.Exists(symbolsPath)) { readerParameters.SymbolReaderProvider = pdbReaderProvider; readerParameters.ReadSymbols = true; } // read assembly file assemblyDefinition = AssemblyDefinition.ReadAssembly(binaryPath, readerParameters); // load assembly modules modules = new Stack <ILModule>(); foreach (var moduleDef in assemblyDefinition.Modules) { // read debug symbols for module ISymbolReader symbolReader = null; if (readerParameters.ReadSymbols) { symbolReader = pdbReaderProvider.GetSymbolReader(moduleDef, symbolsPath); } // add module var module = new ILModule(allAssemblies, this, loadReferences, moduleDef, symbolReader, assemblyResolver); modules.Push(module); } }
public void LoadPdbOnDemand() { var assembly = File.ReadAllBytes(GetAssemblyResourcePath("Microsoft.AspNetCore.Components.dll")); var pdb = File.ReadAllBytes(GetAssemblyResourcePath("Microsoft.AspNetCore.Components.pdb")); var module = ModuleDefinition.ReadModule(new MemoryStream(assembly), new ReaderParameters(ReadingMode.Immediate)); var type = module.GetType("Microsoft.AspNetCore.Components.Rendering.ComponentState"); var main = type.GetMethod("RenderIntoBatch"); var debug_info = main.DebugInformation; var pdbReaderProvider = new PdbReaderProvider(); var symbolReader = pdbReaderProvider.GetSymbolReader(module, new MemoryStream(pdb)); module.ReadSymbols(symbolReader); type = module.GetType("Microsoft.AspNetCore.Components.Rendering.ComponentState"); main = type.GetMethod("RenderIntoBatch"); debug_info = main.DebugInformation; Assert.AreEqual(9, debug_info.SequencePoints.Count); }
async Task <MethodInfo> LoadSymbolsOnDemand(AssemblyInfo asm, uint method_token, SessionId sessionId, CancellationToken token) { var context = GetContext(sessionId); if (asm.TriedToLoadSymbolsOnDemand) { return(null); } asm.TriedToLoadSymbolsOnDemand = true; ImageDebugHeader header = asm.Image.GetDebugHeader(); for (var i = 0; i < header.Entries.Length; i++) { var entry = header.Entries[i]; if (entry.Directory.Type != ImageDebugType.CodeView) { continue; } var data = entry.Data; if (data.Length < 24) { return(null); } var pdbSignature = (data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24)); if (pdbSignature != 0x53445352) // "SDSR" mono/metadata/debug-mono-ppdb.c#L101 { return(null); } var buffer = new byte[16]; Buffer.BlockCopy(data, 4, buffer, 0, 16); var pdbAge = (data[20] | (data[21] << 8) | (data[22] << 16) | (data[23] << 24)); var pdbGuid = new Guid(buffer); var buffer2 = new byte[(data.Length - 24) - 1]; Buffer.BlockCopy(data, 24, buffer2, 0, (data.Length - 24) - 1); var pdbName = System.Text.Encoding.UTF8.GetString(buffer2, 0, buffer2.Length); pdbName = Path.GetFileName(pdbName); foreach (var urlSymbolServer in urlSymbolServerList) { var downloadURL = $"{urlSymbolServer}/{pdbName}/{pdbGuid.ToString("N").ToUpper() + pdbAge}/{pdbName}"; try { using HttpResponseMessage response = await client.GetAsync(downloadURL); using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync(); var portablePdbReaderProvider = new PdbReaderProvider(); var symbolReader = portablePdbReaderProvider.GetSymbolReader(asm.Image, streamToReadFrom); asm.ClearDebugInfo(); //workaround while cecil PR #686 is not merged asm.Image.ReadSymbols(symbolReader); asm.Populate(); foreach (var source in asm.Sources) { var scriptSource = JObject.FromObject(source.ToScriptSource(context.Id, context.AuxData)); SendEvent(sessionId, "Debugger.scriptParsed", scriptSource, token); } return(asm.GetMethodByToken(method_token)); } catch (Exception e) { Log("info", $"Unable to load symbols on demand exception: {e.ToString()} url:{downloadURL} assembly: {asm.Name}"); } } break; } Log("info", "Unable to load symbols on demand assembly: {asm.Name}"); return(null); }