按照我之前的问题,我想在其中转储堆栈中的所有变量(来自当前和所有前一帧),可在此处查看:Is there a way to examine the stack variables at runtime in C#?
我被建议手动拦截调用或使用像PostSharp这样的AOP框架来简化这样的任务。我查看了PostSharp,并且拦截参数不包含当前堆栈帧中的变量。我想知道是否有一种简单的方法可以自动获取当前堆栈帧中的所有局部变量。我想我可以执行代码分析并生成将所有这些值复制到集合中的代码,但也许有一个内置机制可以实现它。
提前感谢任何建议。
编辑:我应该详细说明为什么要这样做。我希望能够在方法中间暂停执行。如果我有堆栈的内容,我可以稍后恢复执行,甚至序列化它并在另一台机器上继续(假设它是相对简单的代码,因此没有线程或I / O)。运行代码分析工具是可以的,这将允许我自动生成保存此状态的额外代码。我想我可能需要分析CIL才能做到这一点。答案 0 :(得分:6)
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();
答案 1 :(得分:5)
您应该使用调试API并从另一个进程调试您的程序。编写自己的托管调试器并非易事,但至少支持实现既定目标的方式。
据我所知,托管.Net框架中没有任何内容可用于收集有关方法局部变量的运行时状态的信息。
请注意,当局部变量的值不存在以编写通用代码来处理它们时,有足够的情况:
答案 2 :(得分:2)
考虑使用Write minidumps 一个custom PostSharp aspect (with IL transformation)。
一个用C#编写的共享调试引擎库。在NuGet上可以Microsoft.Samples.Debugging.MdbgEngine获得。
代码在GitHub上作为PADRE ( Pluggable Automatic Debugging and Reporting Engine)repository
的一部分提供