Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取堆栈上局部变量和参数的当前值?_C#_.net_Debugging_Reflection_Cil - Fatal编程技术网

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

C# 如何获取堆栈上局部变量和参数的当前值?,c#,.net,debugging,reflection,cil,C#,.net,Debugging,Reflection,Cil,在.NET应用程序中,我需要收集一些有关当前线程状态的调试信息。我可以获得一些信息。特别是,我可以得到当前堆栈帧的列表,包括相应的对象,它可以为我提供IL代码、局部变量和参数的数量以及参数名 如何获取这些局部变量和参数(至少是基本类型)的当前值 我无法手动将任何调试器附加到应用程序,但如果需要,应用程序可以生成新进程。您能够将变量的值写入控制台或日志文件吗 System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable

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

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


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

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

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

您必须在所涉及的方法上使用它,这样内联就不会阻止您看到想要看到的内容


通常,对于其他本地信息,您可以使用数据库或平面文件或类似性质的日志

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


此文档可能有助于--

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

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

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



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

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


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

看看。这是不可能的,局部变量和方法参数会被抖动严重优化。从反射中看不到的。只有调试器有机会检查它们的值,它知道从哪里读取它们。通常,它对于发布版本仍然不起作用。@X.C.您可以将它们保存到运行数据类中,并将其打印到文件中……是否有无法附加调试器的特定原因?远程调试呢?在您的例子中,这是作为对捕获的本地异常的响应来完成的吗?例外。数据有帮助吗?