Tag: stackframe

如何获取堆栈帧的执行对象?

使用reflection时,可以使用System.Diagnostics.StackTrace获取调用堆栈(除了它可以是由JIT优化引起的粗略近似)并检查包含的StackFrame对象。 如何获取对堆栈帧中的方法正在执行的对象(this-pointer)的引用? 我知道我可以通过在堆栈框架对象上调用GetMethod()来获取MethodBase,但我正在寻找的东西是GetObject()(如果方法是静态的话,它会自然地返回null)。 看起来堆栈帧对象只能查询静态确定的信息,例如方法信息,原始文件等。 VS调试器知道(尽管它可能使用另一种获取调用堆栈跟踪的方法),因为可以双击调用堆栈窗口中的任何堆栈帧并查看本地和类字段的值。 编辑:澄清:我想要调用该方法的对象实例 。 即:如果在调用堆栈的某个地方的对象实例A上调用方法Foo(),并且它级联到我执行堆栈跟踪的方法,我想从我执行堆栈跟踪的位置获取对A的引用。 (不是方法库的声明类型)

有没有一种简单的方法来获取C#(或CIL)中当前堆栈帧中的所有局部变量

按照我之前的问题,我想在其中转储堆栈中的所有变量(从当前和所有前一帧),这里可以看到: 有没有办法在运行时检查C#中的堆栈变量? 我被建议手动拦截调用或使用像PostSharp这样的AOP框架来简化这样的任务。 我查看了PostSharp,并且拦截参数不包括当前堆栈帧中的变量。 我想知道是否有一种简单的方法可以自动获取当前堆栈帧中的所有局部变量。 我想我可以执行代码分析并生成将所有这些值复制到集合中的代码,但也许有一个内置机制来完成它。 在此先感谢您的任何建议。 编辑:我应该详细说明为什么我要这样做。 我希望能够在方法中间暂停执行。 如果我有堆栈的内容,我可以稍后恢复执行,甚至序列化它并在另一台机器上继续(假设它是相对简单的代码,因此没有线程或I / O)。 运行代码分析工具是可以的,这将允许我自动生成保存此状态的额外代码。 我想我可能要分析CIL才能做到这一点。