打印出沿着堆栈跟踪的参数值

6

使用 System.Diagnostics 打印堆栈跟踪并不难。我想知道是否有可能打印传递给每个方法的参数值,如果不行,为什么不行。

以下是我的初步代码:

public static class CallStackTracker
{
    public static void Print()
    {
        var st = new StackTrace();
        for (int i = 0; i < st.FrameCount; i++)
        {
            var frame = st.GetFrame(i);
            var mb = frame.GetMethod();
            var parameters = mb.GetParameters();
            foreach (var p in parameters)
            {
                // Stuff probably goes here, but is there another way?
            }
        }
    }
}

感谢您提前的帮助。

不行:MethodInfo.GetParameters 返回的是声明的参数,而不是实际的参数值... - Thomas Levesque
@ThomasLevesque:好的,那么这种特定的方法可能行不通。还有其他的方法吗? - user420667
只有调试器可以获取必要的信息,这些信息来自.pdb文件。然而,这还不够,程序本身无法进行调试,并且该信息仅适用于Debug构建。优化方法调用是非常重要的即时编译器优化目标。你不能让这个工作。 - Hans Passant
@HansPassant:我做不到的是什么?我不确定你从哪里得出我试图优化任何东西的结论。 - user420667
1个回答

2

至少使用System.Diagnostics提供的类是无法做到这一点的。 StackFrame类没有提供访问参数值的方法(例如,MethodBase.GetParameters提供有关声明的参数信息,例如名称和类型,但不提供实际参数的值)。

我认为可以使用CLR调试API来实现,但可能无法从C#中实现。


对于CLR调试API参考,我给予+1的推荐。我不明白为什么这不能轻松地提供。 - user420667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接