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)); } }
/// <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; }
/// <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(); }
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); } }
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); }
/// <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; } }
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); }