Exemple #1
0
 /// <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);
 }
Exemple #2
0
        /// <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));
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }