【问题标题】:How get value of parameters in stacktrace如何获取堆栈跟踪中的参数值
【发布时间】:2012-06-01 22:27:08
【问题描述】:

我可以使用以下方式通过 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。 我该怎么做?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 仅供参考,您的第二个链接已失效
  • @Fredou:感谢您的告知,我已将链接更新到信息的新地址。
  • 请举例!
【解决方案2】:

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

!ClrStack -p

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

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

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2010-10-11
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2010-09-11
    • 2010-12-06
    相关资源
    最近更新 更多