在.NET应用程序中,我有一些要点需要收集有关当前线程状态的调试信息。我可以获得一些信息new StackTrace()
的构造函数。特别是,我可以得到当前堆栈帧的列表,包括对应的MethodInfo
对象,它们可以提供IL代码,局部变量和参数的数量以及参数名称。我怎样才能获得堆栈上当地人和参数的当前值?
我怎样才能得到当前值这些当地人和参数的(至少是基本类型的)?
我不能手动附加任何调试器到应用程序,但应用程序可以产生新的进程,如果需要的话。
在.NET应用程序中,我有一些要点需要收集有关当前线程状态的调试信息。我可以获得一些信息new StackTrace()
的构造函数。特别是,我可以得到当前堆栈帧的列表,包括对应的MethodInfo
对象,它们可以提供IL代码,局部变量和参数的数量以及参数名称。我怎样才能获得堆栈上当地人和参数的当前值?
我怎样才能得到当前值这些当地人和参数的(至少是基本类型的)?
我不能手动附加任何调试器到应用程序,但应用程序可以产生新的进程,如果需要的话。
您能够将变量的值写入控制台或日志文件吗?
System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable);
Console.WriteLine("Value of my variable: "+myvariable);
你必须在涉及的方法上使用这种方法,这样内联不会阻止你看到你想看到的东西。
通常情况下,对于其他地方的信息,您使用记录到数据库或平面文件或类似这种事情。
记录应该相当简单。创建日志文件或执行WriteLine()。
这个文件也可以帮助 - http://msdn.microsoft.com/en-us/library/tss153kw.aspx
思考,你正在使用获得的MethodInfo和其他细节的东西,用在编译时创建的元数据 - 也就是说,你正在访问的数据没有任何关系运行 - 时间数据,这是你想要的。
你提到你不能使用调试器,而你是对的,因为在生产代码中通常没有调试符号加载到你的程序集中;一个调试器在那里没用。
这里的一个重要事情是,在.NET架构中,一旦运行程序集,就会运行“抖动”并将IL代码转换为本地代码;其结果是,内存中加载的内容是纯粹的机器代码,您无法轻易入侵以获取值(尽管理论上可能为)。提到的另一点是优化 - 只要它们处于打开状态,您可以预期方法消失(内嵌),执行顺序可能会更改,变量将被文字替换。编译器做了很多事情来让你的代码运行得更快。
虽然我不能看到当地人取得了良好的解决方案在运行时的值,我觉得有办法获取参数的使用截取等技术的价值。看看PostSharp能为你做什么。
一个很好的选择是使用Postsharp。 它基于面向方面编程和代码注入。 它允许您采取方法中的参数值。
也许可以解决您的一部分需求。
看看http:// stackoverflow。COM /问题/ 75076 /获得参数值从 - 的StackFrame-在网?RQ = 1。 –
这是不可能的,局部变量和方法参数被抖动严重优化。反思无法实现。只有调试人员才能检查他们的值,它知道在哪里读取它们。通常,它仍然不适用于发布版本。 –
@ X.C。您可以将它们保存到运行数据类中,然后将其打印到文件中。 –