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

clo*_*ven 9 .net c# debugging cil stack-frame

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

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

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

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

JDP*_*ham 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();
Run Code Online (Sandbox Code Playgroud)

  • 这是如何查看方法的IL中定义的局部变量的示例。它对运行时行为(值/状态)或IL中不存在的信息(如名称)都没有帮助。 (2认同)

Ale*_*kov 6

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

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

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

  • 方法可以内联(局部变量将与调用方法合并)
  • 可以优化局部变量
  • 局部变量可能超出范围并且在方法结束时被垃圾收集.