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