C#如何在运行时转储所有变量和当前值有没有内置或者第三方库可以让你简单转储将所有变量转储到内存中?我想要的是能够查看变量及其当前值,类似于通过击中断点并将鼠标悬停在变量上来查看它们,但实际上不必停止程序执行(即只需拍摄快照)。如果它可以将它们转储到一个文件中,然后可以在程序中打开该文件以获得一个漂亮的GUI界面来查看它们,那就太好了,但是一个简单的文本文件转储就足够了。我想不出一种简单的方法来以通用的方式做到这一点。一种可能的方法是以编程方式创建正在运行的进程的转储文件。您可以使用对dbghelp.dll例程的P/Invoke来执行此操作,或者您可以生成cdb.exe进程来创建转储文件。获得该文件后,您可以在调试器中打开它以便稍后使用带有cdb.exe/windbg.exe的SOS.dll进行分析,甚至可以编写调试器脚本来自动转储所需数据。我确信某种日志记录框架可以帮助您做到这一点...查看:http://www.dotnetlogging.com/在我的工作场所,我们使用log4net,它对我们来说非常有用。那么为什么要转储所有变量以供以后分析呢?您是否考虑过先编写代码测试以减少对调试器的依赖并让自动化测试为您检查值?过去,我使用YourKit.Net分析器来分析.Net应用程序。虽然我只用它来亲自连接到正在运行的应用程序,但快照文档确实声明它们有一个ProfilerAPI,可用于以编程方式转储快照以供以后查看。在代码方面,这看起来像这样简单:Controllerc=newController();StringsnapshotPath=c.CaptureSnapshot();我相信您可以将快照文件加载到YourKitGUI中以便稍后查看它们。如果JetBrainsdotTracePerformance和RedGatesANTSPerformanceProfiler等其他流行的配置文件具有类似的编程API,我不会感到惊讶,但我无法在他们的网站上快速找到明显的文档(我不想查看他们的网络Workshop发现如果此功能存在!)为此,您可以使用WMemoryProfiler要实现此目的,您当然需要Windbg,但WMemoryProfiler的Api是完全托管的,您基本上可以自己调试进程。该库处理常见的调试器问题,因为它将Windbg包装在一个易于访问的库中。以下代码确实将System.Threading.Thread对象的所有实例放入一个对象数组中。这样,您可以在运行时为您自己的应用程序对象编写可视化工具。另一个重载只会为您提供所有AppDomain中的所有对象。使用(vardebugger=newMdbEng()){vardummy=newThread(()=>{});dummy.Name="虚拟线程";//获取所有AppDomains中的所有线程对象varthreads=debugger.GetObjects("System.Threading.Thread",true);foreach(Threadtinthreads){Console.WriteLine("托管线程{0}的名称为{1}",t.ManagedThreadId,t.Name);}GC.KeepAlive(虚拟);由于它是Windbg的包装器,您还可以动态创建内存转储,然后从进程加载内存转储以从转储中提取对象数据以进行可视化。商业内存分析器(例如Scitech的MemoryProfiler)多年来一直使用这种技术,但是当您有大量内存转储时它会很慢,因为它们也使用Windbg作为转储分析器。可以尝试使用visualstudio最终版自带的Intellitrace工具。这就是您所描述的-它记录了您的应用程序中发生的事情,并允许您在不执行程序的情况下对其进行调试,将鼠标悬停在变量和所有其他调试窗口上以帮助您。您可以使用PostSharp。由于环境应用程序的部署,我发现记录调试时间很有用。并检测/记录很多东西。但显然你需要指定所有你需要记录的变量。在此处查看更多详细信息。以上是C#学习教程:C#如何在运行时转储所有变量和当前值。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处:
