/// <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); }
/// <summary> /// Returns method token and IL offset for given source line number. /// </summary> /// <param name="symbolReaderHandle">symbol reader handle returned by LoadSymbolsForModule</param> /// <param name="filePath">source file name and path</param> /// <param name="lineNumber">source line number</param> /// <param name="methodToken">method token return</param> /// <param name="ilOffset">IL offset return</param> /// <returns> true if information is available</returns> private bool ResolveSequencePoint( IntPtr self, IntPtr symbolReaderHandle, string filePath, int lineNumber, out int methodToken, out int ilOffset) { Debug.Assert(symbolReaderHandle != IntPtr.Zero); GCHandle gch = GCHandle.FromIntPtr(symbolReaderHandle); ISymbolFile symbolFile = (ISymbolFile)gch.Target; return(symbolFile.ResolveSequencePoint(filePath, lineNumber, out methodToken, out ilOffset)); }
/// <summary> /// Returns local variable name for given local index and IL offset. /// </summary> /// <param name="symbolReaderHandle">symbol reader handle returned by LoadSymbolsForModule</param> /// <param name="methodToken">method token</param> /// <param name="localIndex">local variable index</param> /// <param name="localVarName">local variable name return</param> /// <returns>true if name has been found</returns> private bool GetLocalVariableName( IntPtr self, IntPtr symbolReaderHandle, int methodToken, int localIndex, out IntPtr localVarName) { Debug.Assert(symbolReaderHandle != IntPtr.Zero); localVarName = IntPtr.Zero; GCHandle gch = GCHandle.FromIntPtr(symbolReaderHandle); ISymbolFile symbolFile = (ISymbolFile)gch.Target; if (!symbolFile.GetLocalVariableByIndex(methodToken, localIndex, out string localVar)) { return(false); } localVarName = Marshal.StringToBSTR(localVar); return(true); }
/// <summary> /// Returns source line number and source file name for given IL offset and method token. /// </summary> /// <param name="symbolReaderHandle">symbol reader handle returned by LoadSymbolsForModule</param> /// <param name="methodToken">method token</param> /// <param name="ilOffset">IL offset</param> /// <param name="lineNumber">source line number return</param> /// <param name="fileName">source file name return</param> /// <returns> true if information is available</returns> private bool GetLineByILOffset( IntPtr self, IntPtr symbolReaderHandle, int methodToken, long ilOffset, out int lineNumber, out IntPtr fileName) { Debug.Assert(symbolReaderHandle != IntPtr.Zero); fileName = IntPtr.Zero; GCHandle gch = GCHandle.FromIntPtr(symbolReaderHandle); ISymbolFile symbolFile = (ISymbolFile)gch.Target; if (!symbolFile.GetSourceLineByILOffset(methodToken, ilOffset, out lineNumber, out string sourceFileName)) { return(false); } fileName = Marshal.StringToBSTR(sourceFileName); return(true); }