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

按照我之前的问题,我想在其中转储堆栈中的所有变量(从当前和所有前一帧),这里可以看到: 有没有办法在运行时检查C#中的堆栈变量?

我被建议手动拦截调用或使用像PostSharp这样的AOP框架来简化这样的任务。 我查看了PostSharp,并且拦截参数不包括当前堆栈帧中的变量。 我想知道是否有一种简单的方法可以自动获取当前堆栈帧中的所有局部变量。 我想我可以执行代码分析并生成将所有这些值复制到集合中的代码,但也许有一个内置机制来完成它。

在此先感谢您的任何建议。

编辑:我应该详细说明为什么我要这样做。 我希望能够在方法中间暂停执行。 如果我有堆栈的内容,我可以稍后恢复执行,甚至序列化它并在另一台机器上继续(假设它是相对简单的代码,因此没有线程或I / O)。 运行代码分析工具是可以的,这将允许我自动生成保存此状态的额外代码。 我想我可能要分析CIL才能做到这一点。

您应该使用调试API并从另一个进程调试您的程序。 编写自己的托管调试器并非易事,但至少支持实现既定目标的方式。

据我所知,托管.Net框架中没有任何内容可用于收集有关方法局部变量的运行时状态的信息。

请注意,有足够的情况下,不存在局部变量的值,以使编写通用代码来处理它们复杂:

  • 方法可以内联(局部变量将与调用方法合并)
  • 可以优化局部变量
  • 局部变量可以超出范围并在方法结束时进行垃圾收集。
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(); System.Diagnostics.StackFrame frame = trace.GetFrame(0); MethodBase method = frame.GetMethod(); MethodBody methodBody = method.GetMethodBody(); if (methodBody != null) { foreach (var local in methodBody.LocalVariables) { Console.WriteLine(local); } } Console.ReadKey(); 

考虑使用自定义PostSharp方面 编写minidump (使用IL转换 )。

一个共享的debuging引擎库,用C#编写。 可以在NuGet上以Microsoft.Samples.Debugging.MdbgEngine的forms获得 。

该代码在GitHub上作为PADRE(可插入自动调试和报告引擎)存储库的一部分提供