2013-05-27 105 views
23

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

我怎样才能得到当前值这些当地人和参数的(至少是基本类型的)?

我不能手动附加任何调试器到应用程序,但应用程序可以产生新的进程,如果需要的话。

+1

看看http:// stackoverflow。COM /问题/ 75076 /获得参数值从 - 的StackFrame-在网?RQ = 1。 –

+6

这是不可能的,局部变量和方法参数被抖动严重优化。反思无法实现。只有调试人员才能检查他们的值,它知道在哪里读取它们。通常,它仍然不适用于发布版本。 –

+0

@ X.C。您可以将它们保存到运行数据类中,然后将其打印到文件中。 –

回答

0

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

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

你必须在涉及的方法上使用这种方法,这样内联不会阻止你看到你想看到的东西。

MethodImplOptions.NoInlining

通常情况下,对于其他地方的信息,您使用记录到数据库或平面文件或类似这种事情。

2

思考,你正在使用获得的MethodInfo和其他细节的东西,用在编译时创建的元数据 - 也就是说,你正在访问的数据没有任何关系运行 - 时间数据,这是你想要的。

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

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


虽然我不能看到当地人取得了良好的解决方案在运行时的值,我觉得有办法获取参数的使用截取等技术的价值。看看PostSharp能为你做什么。

0

一个很好的选择是使用Postsharp。 它基于面向方面编程和代码注入。 它允许您采取方法中的参数值。

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