【问题标题】:Is there a way to examine the stack variables at runtime in C#?有没有办法在 C# 运行时检查堆栈变量?
【发布时间】:2011-07-05 01:31:59
【问题描述】:

有没有办法在运行时转储堆栈的内容?

我对可以通过 StackTrace 和 StackFrame 类获得的父函数信息(名称、参数、行)感兴趣。但是,我还想获取堆栈中的变量(在调用当前正在执行的方法中声明的局部变量)。由于 Visual Studio 调试器可以做到这一点,我认为可能有一种方法可以在运行时在代码中做到这一点。有没有这样的方法?

【问题讨论】:

  • 根据this post 看来您无法使用 StackTrace 和 StackFrame 类来做到这一点。
  • 谢谢!这是一个非常相似的问题。我想知道是否有比使用拦截更简单的方法来做到这一点。
  • 只有调试器才能做到这一点,而且只有在代码没有经过优化的情况下才能完成可靠的工作。当您发现程序无法自行调试时,这总是会很快死去。

标签: c# debugging stack stack-trace callstack


【解决方案1】:

我想有两种方法可以实现。

您的第一个选择是使用 AOP 框架将检测代码作为编译后步骤注入。这可以很好地定位并让您几乎可以做任何您想做的事情,但是当您可以将所需的附加行为与其余代码隔离时效果最好。 PostSharp 是该领域的领先竞争者,但我敢肯定还有其他人。

您的第二个选择是挂钩到分析器 API,这就是 TypeMock Isolator 和微软自己的 Moles 所做的。它基本上为您提供了拦截所有内容的方法,但它对程序非常具有侵入性,而且实现起来肯定不是一项微不足道的任务。事实上,我不会向任何人推荐这种方法,只是为了完整起见。

【讨论】:

  • 谢谢。 PostSharp 似乎非常强大,并且使我免于手动进行拦截。也许我的问题应该是。如何捕获当前堆栈帧的整个状态。不过,将其作为单独的问题发布可能更有意义
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2012-03-25
  • 2018-02-04
  • 2012-09-02
相关资源
最近更新 更多