Example #1
0
        private void AddLocalVars(MetadataReader pdb, SymbolScope scope, LocalVariableHandleCollection localVars)
        {
            foreach (var varHandle in localVars)
            {
                var localVar = pdb.GetLocalVariable(varHandle);

                scope.AddLocal(new SymbolVariable(pdb.GetString(localVar.Name), localVar.Attributes, localVar.Index));
            }
        }
Example #2
0
 /// <summary>
 /// Constructs a new variable enumerator.
 /// </summary>
 /// <param name="localVariables">The collection of local variables.</param>
 /// <param name="metadataReader">The assocated metadata reader.</param>
 internal VariableEnumerator(
     LocalVariableHandleCollection localVariables,
     MetadataReader metadataReader)
 {
     LocalVariables = localVariables;
     MetadataReader = metadataReader;
     enumerator     = LocalVariables.GetEnumerator();
     Current        = default;
 }
Example #3
0
 /// <summary>
 /// Constructs a new scope.
 /// </summary>
 /// <param name="localScope">The current local scope.</param>
 /// <param name="metadataReader">The assocated metadata reader.</param>
 internal MethodScope(
     LocalScope localScope,
     MetadataReader metadataReader)
 {
     MetadataReader = metadataReader;
     StartOffset    = localScope.StartOffset;
     Length         = localScope.Length;
     localVariables = localScope.GetLocalVariables();
 }
Example #4
0
        private static IEnumerable <LocalVariableHandleCollection> GetLocalVariableHandles(MetadataReader metadataReader, MethodDebugInformationHandle methodDebugHandle)
        {
            LocalScopeHandleCollection scopes = metadataReader.GetLocalScopes(methodDebugHandle);

            foreach (LocalScopeHandle scope in scopes)
            {
                LocalVariableHandleCollection localVariables = metadataReader.GetLocalScope(scope).GetLocalVariables();
                yield return(localVariables);
            }
        }
Example #5
0
        private static bool GetLocalsInfoForMethod(string assemblyPath, int methodToken, out List <LocalVarInfo> locals)
        {
            locals = null;

            OpenedReader openedReader = GetReader(assemblyPath, isFileLayout: true, peStream: null, pdbStream: null);

            if (openedReader == null)
            {
                return(false);
            }

            using (openedReader)
            {
                try
                {
                    Handle handle = MetadataTokens.Handle(methodToken);
                    if (handle.Kind != HandleKind.MethodDefinition)
                    {
                        return(false);
                    }

                    locals = new List <LocalVarInfo>();

                    MethodDebugInformationHandle methodDebugHandle =
                        ((MethodDefinitionHandle)handle).ToDebugInformationHandle();
                    LocalScopeHandleCollection localScopes = openedReader.Reader.GetLocalScopes(methodDebugHandle);
                    foreach (LocalScopeHandle scopeHandle in localScopes)
                    {
                        LocalScope scope = openedReader.Reader.GetLocalScope(scopeHandle);
                        LocalVariableHandleCollection localVars = scope.GetLocalVariables();
                        foreach (LocalVariableHandle varHandle in localVars)
                        {
                            LocalVariable localVar = openedReader.Reader.GetLocalVariable(varHandle);
                            if (localVar.Attributes == LocalVariableAttributes.DebuggerHidden)
                            {
                                continue;
                            }
                            LocalVarInfo info = new LocalVarInfo();
                            info.startOffset = scope.StartOffset;
                            info.endOffset   = scope.EndOffset;
                            info.name        = openedReader.Reader.GetString(localVar.Name);
                            locals.Add(info);
                        }
                    }
                }
                catch
                {
                    return(false);
                }
            }
            return(true);
        }
Example #6
0
        /// <summary>
        /// Helper method to return local variable name for given local index and IL offset.
        /// </summary>
        /// <param name="assemblyFileName">file name of the assembly</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>
        public static bool GetLocalVariableByIndex(string assemblyFileName, int methodToken, int localIndex, out string localVarName)
        {
            MetadataReader peReader, pdbReader;

            localVarName = null;

            try
            {
                if (!GetReaders(assemblyFileName, out peReader, out pdbReader))
                {
                    return(false);
                }

                Handle handle = MetadataTokens.Handle(methodToken);
                if (handle.Kind != HandleKind.MethodDefinition)
                {
                    return(false);
                }

                MethodDebugInformationHandle methodDebugHandle = ((MethodDefinitionHandle)handle).ToDebugInformationHandle();
                LocalScopeHandleCollection   localScopes       = pdbReader.GetLocalScopes(methodDebugHandle);
                foreach (LocalScopeHandle scopeHandle in localScopes)
                {
                    LocalScope scope = pdbReader.GetLocalScope(scopeHandle);
                    LocalVariableHandleCollection localVars = scope.GetLocalVariables();
                    foreach (LocalVariableHandle varHandle in localVars)
                    {
                        LocalVariable localVar = pdbReader.GetLocalVariable(varHandle);
                        if (localVar.Index == localIndex)
                        {
                            if (localVar.Attributes == LocalVariableAttributes.DebuggerHidden)
                            {
                                return(false);
                            }
                            localVarName = pdbReader.GetString(localVar.Name);
                            return(true);
                        }
                    }
                }
                return(false);
            }
            finally
            {
                peReader  = null;
                pdbReader = null;
            }
        }
Example #7
0
        internal static bool GetLocalVariableAndScopeByIndex(IntPtr symbolReaderHandle, int methodToken, int localIndex, out string localVarName, out int ilStartOffset, out int ilEndOffset)
        {
            Debug.Assert(symbolReaderHandle != IntPtr.Zero);
            localVarName  = null;
            ilStartOffset = 0;
            ilEndOffset   = 0;

            GCHandle       gch    = GCHandle.FromIntPtr(symbolReaderHandle);
            MetadataReader reader = ((OpenedReader)gch.Target).Reader;

            try
            {
                Handle handle = MetadataTokens.Handle(methodToken);
                if (handle.Kind != HandleKind.MethodDefinition)
                {
                    return(false);
                }

                MethodDebugInformationHandle methodDebugHandle = ((MethodDefinitionHandle)handle).ToDebugInformationHandle();
                LocalScopeHandleCollection   localScopes       = reader.GetLocalScopes(methodDebugHandle);
                foreach (LocalScopeHandle scopeHandle in localScopes)
                {
                    LocalScope scope = reader.GetLocalScope(scopeHandle);
                    LocalVariableHandleCollection localVars = scope.GetLocalVariables();
                    foreach (LocalVariableHandle varHandle in localVars)
                    {
                        LocalVariable localVar = reader.GetLocalVariable(varHandle);
                        if (localVar.Index == localIndex)
                        {
                            if (localVar.Attributes == LocalVariableAttributes.DebuggerHidden)
                            {
                                return(false);
                            }

                            localVarName  = reader.GetString(localVar.Name);
                            ilStartOffset = scope.StartOffset;
                            ilEndOffset   = scope.EndOffset;
                            return(true);
                        }
                    }
                }
            }
            catch
            {
            }
            return(false);
        }
        /// <summary>
        /// Helper method to return local variable name for given local index and IL offset.
        /// </summary>
        /// <param name="openedReader">symbol reader 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 GetLocalVariableByIndex(
            OpenedReader openedReader,
            int methodToken,
            int localIndex,
            out string localVarName)
        {
            localVarName = null;
            MetadataReader reader = openedReader.Reader;

            try
            {
                Handle handle = MetadataTokens.Handle(methodToken);
                if (handle.Kind != HandleKind.MethodDefinition)
                {
                    return(false);
                }

                MethodDebugInformationHandle methodDebugHandle = ((MethodDefinitionHandle)handle).ToDebugInformationHandle();
                LocalScopeHandleCollection   localScopes       = reader.GetLocalScopes(methodDebugHandle);
                foreach (LocalScopeHandle scopeHandle in localScopes)
                {
                    LocalScope scope = reader.GetLocalScope(scopeHandle);
                    LocalVariableHandleCollection localVars = scope.GetLocalVariables();
                    foreach (LocalVariableHandle varHandle in localVars)
                    {
                        LocalVariable localVar = reader.GetLocalVariable(varHandle);
                        if (localVar.Index == localIndex)
                        {
                            if (localVar.Attributes == LocalVariableAttributes.DebuggerHidden)
                            {
                                return(false);
                            }

                            localVarName = reader.GetString(localVar.Name);
                            return(true);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError($"GetLocalVariableByIndex: {ex.Message}");
            }
            return(false);
        }