如何获得堆栈上的局部变量和参数的当前值?

本文关键字:参数 局部变量 何获得 堆栈 | 更新日期: 2023-09-27 18:15:41

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

如何获得这些局部变量和参数(至少是基本类型)的当前 ?

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

如何获得堆栈上的局部变量和参数的当前值?

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

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

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


虽然我看不出在运行时获得局部值的好解决方案,但我认为有方法使用拦截技术获得参数值。看看PostSharp能为你做些什么。

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

MethodImplOptions。NoInlining

通常,对于其他本地信息,您使用日志记录器到db或平面文件或类似的东西。

日志记录应该相当简单。要么创建一个日志文件,要么执行WriteLine()。

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

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

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

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

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