C# 如何使用Microsoft.Diagnostics.Runtime获取有关StackTrace中方法的信息?

C# 如何使用Microsoft.Diagnostics.Runtime获取有关StackTrace中方法的信息?,c#,clrmd,C#,Clrmd,代码: 结果,我得到的不是方法名而是“未知”。但是in方法是字段“InstructionPointer”,也许它会提供更多信息?未知表示该方法没有与之关联的托管方法。尝试将其附加到其他进程,也在所有堆栈中的所有帧上漫游,我相信您会找到一些东西 您可以找到转储堆栈(包括堆栈对象)的工作示例 这不是ClrMD的有效用法。您正在查看自己的线程,而不是冻结进程中的线程。就像从小型转储或调试器断点获得的一样。您自己的线程忙于执行代码,因此它们的堆栈会不断变化。在您使用thread.StackTrace时,

代码:


结果,我得到的不是方法名而是“未知”。但是in方法是字段“InstructionPointer”,也许它会提供更多信息?

未知表示该方法没有与之关联的托管方法。尝试将其附加到其他进程,也在所有堆栈中的所有帧上漫游,我相信您会找到一些东西

您可以找到转储堆栈(包括堆栈对象)的工作示例


这不是ClrMD的有效用法。您正在查看自己的线程,而不是冻结进程中的线程。就像从小型转储或调试器断点获得的一样。您自己的线程忙于执行代码,因此它们的堆栈会不断变化。在您使用thread.StackTrace时,您的代码可能正在DAC中运行。本地C++代码,它将是未知的。如果我进入另一个进程,我得到相同的结果。看看它是否能帮助你,我使用了几乎相同的代码,并得到了一些好的信息。我的情况是,我想看看是什么导致我的生产代码减速。我创建了一个System.Timers.Timer,它将在程序的关键部分每500毫秒运行一次,并将所有线程的堆栈帧转储到日志中。1。如果您从应用程序内部查看StackTrace常规方法,我们可以看到一个类似的集合,但具有方法的名称。所以我开始寻找方法,在所有流中使用MiСrosoft.DiagnostiСs.Runtime获取它们。2.在这些行中,我找到了一类类型,这些类型会导致这些方法,如果(runtime.ReadPointer(frame.StackPointer,out obj)){ClrType type=heap.GetObjectType(obj);…}那么框架就是thread.stacktracei中的一个框架如果我理解正确,这个类的一个方法就在堆栈上。我不确定我是否理解你的评论。它是否有效?你查过密码了吗?图片是我从运行的WPF应用程序(附加到进程)中转储的随机堆栈。您看到的是特定堆栈上的方法列表,扩展器向您显示了该方法中的对象(及其值),我只看到您得到了堆中的对象的补充,即ClrType type=heap.GetObjectType(obj);但是它并没有解决问题,@Б敪敪敪敪敪
GetObjectType
只是用于从堆栈上的指针获取对象。如果您对取消引用这些对象不感兴趣,则不需要这样做。
using System.Diagnostics;
using System.Linq;
using Microsoft.Diagnostics.Runtime;
using Microsoft.Diagnostics.Runtime.Utilities;
using Microsoft.Diagnostics.Runtime.Utilities.Pdb;

namespace myDiagnostics
{
    public class myStackTraceInfo
    {
        public void Atach()
        {
            using (DataTarget target = DataTarget.AttachToProcess(Process.GetCurrentProcess().Id, 5000, AttachFlag.Passive))
            {
                ClrRuntime runtime = target.ClrVersions.First().CreateRuntime();
                foreach (ClrThread thread in runtime.Threads)
                {
                    foreach (ClrStackFrame frame in thread.StackTrace)
                        Console.Write(frame.Method.ToString());
                }
            }
        }
    }
}