2011-02-27 16 views
7

继我上一个问题之后,我想将堆中的所有变量(从当前和前一个帧)可以在这里看到:Is there a way to examine the stack variables at runtime in C#?是否有一种简单的方法来获取C#(或CIL)中当前堆栈帧中的所有局部变量

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

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

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

+0

您需要做什么? – 2011-02-27 21:33:47

+1

祝你的目标好运。我建议阅读.Net中垃圾回收的细节 - 它确实会暂停托管代码的执行,并用方法的数据进行操作。 (搜索像“insde .net垃圾回收”开始) – 2011-03-01 00:23:39

回答

5

您应该使用调试API并从另一个进程调试您的程序。编写自己的托管调试器不是微不足道的,但至少可以实现您的既定目标。

据我所知,管理.Net框架中没有任何东西可以用来收集有关方法局部变量运行时状态的信息。

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

  • 方法可以被内联(局部变量将调用方法合并)
  • 局部变量可以优化出来
  • 局部变量可以超出范围,并在方法结束时被垃圾收集。
+0

所以它不会很简单,但现在我有很多想法。 – cloudraven 2011-03-01 23:09:45

5
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(); 
+0

无法弄清楚如何显示名称或值:( – JDPeckham 2011-02-27 21:32:02

+1

这是示例如何查看在方法的IL中定义的局部变量,它不会帮助运行时行为(值/状态),也不存在于类似IL的名称中的信息 – 2011-02-27 22:52:16

+0

这几乎可行,但是,我肯定需要变量的名称 – cloudraven 2011-02-28 06:16:07

相关问题