如何在堆栈中获取本地和参数的当前值?

时间:2013-05-27 02:59:25

标签: c# .net debugging reflection cil

在.NET应用程序中,我有一些要点,我需要收集有关当前线程状态的一些调试信息。我可以获得一些信息new StackTrace()构造函数。特别是,我可以获取当前堆栈帧的列表,包括相应的MethodInfo对象,它可以为我提供IL代码,局部变量和参数的数量以及参数名称。

  

如何获取这些本地和参数的当前(至少是原始类型)?

我无法手动将任何调试器附加到应用程序,但应用程序可以根据需要生成新进程。

5 个答案:

答案 0 :(得分:2)

反射,你用来获取MethodInfo和其他细节,使用在编译时创建的元数据 - 也就是说,你访问的数据与运行时数据无关,这就是你想要的。

你提到你不能使用调试器,而你是对的,因为在生产代码中,程序集中通常没有加载调试符号;调试器在那里没用。

重要的是,根据.NET体系结构,一旦运行程序集,就会运行“jitter”并将IL代码转换为本机代码;结果是内存中加载的内容是纯机器代码,您无法轻易入侵以获取值(尽管理论上可能)。提到的另一点是优化 - 只要它们打开,您可以期望方法消失(内联),执行顺序可能会更改,变量会被文字替换。编译器做了很多事情来让你的代码运行得更快。


虽然我看不到在运行时获取本地值的好方法,但我认为有一些方法可以使用拦截技术获取参数值。看看PostSharp可以为您做些什么。

答案 1 :(得分:0)

您是否能够将变量的值写入控制台或日志文件?

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable);
Console.WriteLine("Value of my variable: "+myvariable);

答案 2 :(得分:0)

您必须在涉及的方法上使用此方法,以便内联不会阻止您看到您想要查看的内容。

MethodImplOptions.NoInlining

通常,对于其他本地信息,您使用记录器来访问db或flat文件或其他类似的东西。

答案 3 :(得分:0)

记录应该相当简单。创建日志文件或执行WriteLine()。

此文档可能会有所帮助 - http://msdn.microsoft.com/en-us/library/tss153kw.aspx

答案 4 :(得分:0)

一个很好的选择是使用Postsharp。 它基于面向方面编程和代码注入。 它让你在方法中获取参数值。

也许可以解决您的部分需求。