/// <summary> /// Reads the CLR source file name, line number and displacement. /// </summary> /// <param name="module">The module.</param> /// <param name="method">The method.</param> /// <param name="address">The address.</param> internal static Tuple <string, uint, ulong> ReadClrSourceFileNameAndLine(Module module, Microsoft.Diagnostics.Runtime.ClrMethod method, ulong address) { Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbReader pdbReader = module.ClrPdbReader; Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbFunction function = pdbReader.GetFunctionFromToken(method.MetadataToken); uint ilOffset = StackFrame.FindIlOffset(method, address); ulong distance = ulong.MaxValue; string sourceFileName = ""; uint sourceFileLine = uint.MaxValue; foreach (Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbSequencePointCollection sequenceCollection in function.SequencePoints) { foreach (Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbSequencePoint point in sequenceCollection.Lines) { if (point.Offset <= ilOffset) { ulong dist = ilOffset - point.Offset; if (dist < distance) { sourceFileName = sequenceCollection.File.Name; sourceFileLine = point.LineBegin; distance = dist; } } } } return(Tuple.Create(sourceFileName, sourceFileLine, distance)); }
/// <summary> /// Gets the CLR local variable names. /// </summary> private string[] GetClrLocalsNames() { var pdb = Module?.ClrPdbReader; if (Module == null) { try { string pdbPath = ClrStackFrame.Runtime.DataTarget.SymbolLocator.FindPdb(ClrStackFrame.Module.Pdb); if (!string.IsNullOrEmpty(pdbPath)) { pdb = new Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbReader(pdbPath); } } catch { } } if (pdb == null) { return(Enumerable.Range(0, ClrStackFrame.Locals.Count).Select(id => string.Format("local_{0}", id)).ToArray()); } else { var function = pdb.GetFunctionFromToken(ClrStackFrame.Method.MetadataToken); uint ilOffset = FindIlOffset(ClrStackFrame); var scope = function.FindScopeByILOffset(ilOffset); return(GetRecursiveSlots(scope).Select(s => s.Name).ToArray()); } }
/// <summary> /// Gets the CLR local variable names. /// </summary> private string[] GetClrLocalsNames() { var pdb = Module?.ClrPdbReader; if (Module == null) { try { string pdbPath = ClrStackFrame.Runtime.DataTarget.SymbolLocator.FindPdb(ClrStackFrame.Module.Pdb); if (!string.IsNullOrEmpty(pdbPath)) { pdb = new Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbReader(pdbPath); } } catch { } } if (pdb == null) { return Enumerable.Range(0, ClrStackFrame.Locals.Count).Select(id => string.Format("local_{0}", id)).ToArray(); } else { var function = pdb.GetFunctionFromToken(ClrStackFrame.Method.MetadataToken); uint ilOffset = FindIlOffset(ClrStackFrame); var scope = function.FindScopeByILOffset(ilOffset); return GetRecursiveSlots(scope).Select(s => s.Name).ToArray(); } }