/// <summary> /// Checks availability of debugging information for given assembly. /// </summary> /// <param name="assemblyPath"> /// File path of the assembly or null /// </param> /// <param name="isFileLayout">type of in-memory PE layout, if true, file based layout otherwise, loaded layout</param> /// <param name="loadedPeAddress"> /// Loaded PE image address or zero if the module is dynamic (generated by Reflection.Emit). /// Dynamic modules have their PDBs (if any) generated to an in-memory stream /// (pointed to by <paramref name="inMemoryPdbAddress"/> and <paramref name="inMemoryPdbSize"/>). /// </param> /// <param name="loadedPeSize">loaded PE image size</param> /// <param name="inMemoryPdbAddress">in memory PDB address or zero</param> /// <param name="inMemoryPdbSize">in memory PDB size</param> /// <returns>Symbol reader handle or zero if error</returns> private IntPtr LoadSymbolsForModule( IntPtr self, string assemblyPath, bool isFileLayout, ulong loadedPeAddress, uint loadedPeSize, ulong inMemoryPdbAddress, uint inMemoryPdbSize) { try { ISymbolFile symbolFile = null; if (loadedPeAddress != 0) { Stream peStream = _memoryService.CreateMemoryStream(loadedPeAddress, loadedPeSize); symbolFile = _symbolService.OpenSymbolFile(assemblyPath, isFileLayout, peStream); } if (inMemoryPdbAddress != 0) { Stream pdbStream = _memoryService.CreateMemoryStream(inMemoryPdbAddress, inMemoryPdbSize); symbolFile = _symbolService.OpenSymbolFile(pdbStream); } if (symbolFile != null) { GCHandle gch = GCHandle.Alloc(symbolFile); return(GCHandle.ToIntPtr(gch)); } } catch (Exception ex) { Trace.TraceError($"LoadSymbolsForModule: {ex.Message}"); } return(IntPtr.Zero); }