如何在stacktrace中获取参数值

时间:2012-05-26 20:49:12

标签: c# .net exception stack-trace system.diagnostics

我可以通过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。 我是怎么做到的?

2 个答案:

答案 0 :(得分:9)

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

对于进程内省,有Profiler API, which also can find information about function arguments。查看有关“影子堆栈”的信息。

答案 1 :(得分:3)

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

是有效的
!ClrStack -p

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

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