23

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

如何获取这些局部变量和参数(至少是原始类型)的当前值?

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

4

5 回答 5

2

反射,您用于获取 MethodInfo 和其他详细信息的方法,使用在编译时创建的元数据——也就是说,您正在访问的数据与您想要的运行时数据无关。

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

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


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

于 2013-08-08T12:10:31.513 回答
0

An excellent choice is to use Postsharp. It is based on Aspect Oriented Programming and Code Injection. It allos you to take the parameters values in method.

Maybe can solve part of your needs.

于 2013-08-13T20:29:02.607 回答
0

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

MethodImplOptions.NoInlining

通常,对于其他本地信息,您使用记录器来记录数据库或平面文件或类似的东西。

于 2013-07-22T17:24:44.790 回答
0

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

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

于 2013-08-07T15:50:12.080 回答
-1

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

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable);
Console.WriteLine("Value of my variable: "+myvariable);
于 2013-05-27T03:26:39.233 回答