【问题标题】:Is there a simple way to obtain all the local variables in the current stack frame in C# (or CIL)有没有一种简单的方法可以在 C#(或 CIL)中获取当前堆栈帧中的所有局部变量
【发布时间】:2011-02-27 21:03:17
【问题描述】:

在我之前的问题之后,我想转储堆栈中的所有变量(从当前帧和所有前一帧),可以在这里看到:Is there a way to examine the stack variables at runtime in C#?

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

提前感谢您的任何建议。

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

【问题讨论】:

  • 祝你目标顺利。我建议阅读 .Net 中垃圾收集的详细信息 - 它确实暂停托管代码的执行并使用方法的数据进行操作。 (搜索“insde .net 垃圾收集”之类的内容开始)

标签: c# .net debugging cil stack-frame


【解决方案1】:

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

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

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

  • 方法可以内联(局部变量将与调用方法合并)
  • 局部变量可以优化出来
  • 局部变量可能会超出范围并在方法结束之前被垃圾回收。

【讨论】:

  • 所以这并不简单,但现在我有很多事情要考虑。谢谢
【解决方案2】:
   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();

【讨论】:

  • 这是如何查看在方法的 IL 中定义的局部变量的示例。它对运行时行为(值/存在)和 IL 中不存在的信息(例如名称)没有帮助。
  • 这几乎可以工作,但是是的,我肯定需要变量的名称
  • 要获取名称,您必须编写代码在 .pdb 文件中查找它们(如果它们可用)...这并不容易。
【解决方案3】:

考虑使用Write minidumps custom PostSharp aspect (with IL transformation)。

一个共享调试引擎库,用 C# 编写。在 NuGet 上可用 Microsoft.Samples.Debugging.MdbgEngine

代码作为PADRE ( Pluggable Automatic Debugging and Reporting Engine)repository 的一部分在 GitHub 上提供

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2011-02-16
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多