有没有一种方法在C#中运行时检查堆栈变量?

4

有没有一种方法可以在运行时转储堆栈的内容?

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


1
根据这篇文章,看起来您不能使用StackTrace和StackFrame类来实现。 - Bala R
谢谢!那是一个非常相似的问题。我想知道是否有比使用拦截更简单的方法来解决这个问题。 - cloudraven
2
只有调试器才能做到这一点,而且只有在代码没有被优化的情况下才能做得好。当你发现一个程序不能自我调试时,它总是很快死亡。 - Hans Passant
1个回答

1

我认为有两种方法可以实现这个目标。

第一种选择是使用AOP框架作为后编译步骤注入仪器代码。这可以精细定位并让您几乎做任何想做的事情,但最好在能够将所需的附加行为与其余代码隔离开来时使用。PostSharp是该领域的领先竞争者,但我相信还有其他选择。

第二种选择是钩入分析器API,这就是TypeMock Isolator和Microsoft自己的Moles所做的。它基本上为您提供了拦截所有内容的手段,但它对程序的侵入性很大,而且肯定不是一个简单的任务来实现。实际上,除了提及它的完整性外,我不建议任何人采用这种方法。


谢谢。PostSharp 看起来非常强大,并且可以避免我手动拦截。也许我的问题应该是,如何捕获当前堆栈帧的整个状态。不过将其作为一个单独的问题发布可能更合适。 - cloudraven

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