17

我可以使用以下方法通过 StackTrace 获取有关参数的信息:

catch (Exception ex)
{
    var st = new StackTrace(ex);

    System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First();
}

我想知道如何获得参数的值。例子:

如果我在堆栈跟踪中的方法是这样的:

void MyMethod(object value)

电话是这样的:

MyMethod(10);

我想获得 10 的值。我该怎么做?

4

2 回答 2

10

有两种方法。更强大的是用于 .NET 调试的 COM API。例如,调用堆栈中函数的参数和局部变量都可以从ICorDebugILFrame访问。但这必须从作为调试器附加到您的进程的单独进程中运行。

对于进程内自省,有Profiler API,它还可以找到有关函数参数的信息。查看有关“影子堆栈”的信息。

于 2012-05-26T20:58:57.900 回答
3

不使用 C#,除非您正在创建高度依赖 CLR(补丁)版本的解决方案。但是起作用的是将 Windbg 附加到您的进程,将 sos.dll 切换到您的线程并键入

!ClrStack -p

显示托管调用堆栈和大多数方法的方法参数。这即使在调试器下也不是万无一失的,因为由于内联和 JIT 优化,堆栈布局非常灵活。除此之外,一些参数甚至可能不会出现在堆栈内存中,因为它们是通过寄存器传递的(这在 x64 平台下更为常见)。

回答你的第一个问题。不,您尝试的方法是不可能的。一个可行的解决方案是可能的,但根本不是便携的。托管调试器可以部分检索您的参数,但没有 100% 有效的解决方案(即使在调试器下)。

于 2012-05-26T20:55:47.387 回答