是否有任何内置的或第三方库,让你在运行时简单地倾倒在内存中的所有变量? 我想是能够以同样的视图变量与当前值通过敲击断点和鼠标悬停于变量观察他们,但无需实际停止执行程序(即只是得到一个快照)。 将是一件好事,如果这会令他们转储到,然后可以在程序中打开后得到一个不错的GUI界面来查看这些文件,但简单的文本文件的转储会不够好。
Answer 1:
我想不出一个简单的方法在一个通用的方式来做到这一点。 还有什么工作是编程方式创建正在运行的进程的转储文件。 你可以做这一点与P / Invoke来的dbghelp.dll例程或酿出的Cdb.exe进程创建转储文件。 一旦你的文件,你可以在调试器中打开它使用以后分析SOS.dll用的Cdb.exe / WINDBG.EXE ,甚至写一个调试器的脚本来转储你想要的(主要)会自动将数据。
Answer 2:
我相信某种日志框架会帮助你做到这一点?
查看:
http://www.dotnetlogging.com/
在我的工作,我们使用log4net的这工作得适合我们。
那么怎么来的你想倒出来以供日后分析所有的变量? 你有没有考虑过先写你的代码测试,这样就可以减少对调试你的依赖,有一套自动化测试检查值你的?
Answer 3:
在过去,我已经使用了YourKit净探查,以配置文件.NET应用程序。
虽然我只用过它连接到运行的应用程序亲自快照文件确实状态,他们有一个事件探查器API可用于以编程方式转储后审核快照。
代码明智这看起来是作为下面简单:
Controller c = new Controller();
String snapshotPath = c.CaptureSnapshot();
我相信,那么你就可以加载快照文件到YourKit GUI在日后对其进行审查。
我也不会感到惊讶,如果一些其他流行廓喜欢JetBrains公司的dotTrace性能和RedGates 蚁性能分析器也有类似的编程API,但在其网站上我不能很快找到明显的文档(我不想看着自己的网络研讨会找到如果出存在此功能!)
Answer 4:
为此,您可以使用WMemoryProfiler来
- 获取所有应用程序域的所有对象作为对象阵列
- 创建自己的进程的内存转储
- 序列化到光盘特定对象
要做到这一点,你当然需要,但是的Windbg的WMemoryProfiler的API是全面管理,你基本上可以自我调试过程。 该库负责平时的奇特调试器,因为它在一个不错的访问库包WinDBG的。
下面的代码确实得到System.Threading.Thread对象的所有实例到一个对象数组。 这样,你可以写你自己的应用程序可视化对象在运行时。 另超载确实只给你所有的AppDomain中的所有对象。
using (var debugger = new MdbEng())
{
var dummy = new Thread(() => {});
dummy.Name = "Dummy Thread";
// Get all thread objects in all AppDomains
var threads = debugger.GetObjects("System.Threading.Thread", true);
foreach (Thread t in threads)
{
Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name);
}
GC.KeepAlive(dummy);
}
既然是一个包装周围WinDBG的你也可以动态创建一个内存转储后来从你的进程加载内存转储提取对象数据从转储可视化。 商用内存探查器(例如MemoryProfiler从赛特)采用多年以来这种技术,但它是相当缓慢的,当你有一个巨大的内存转储,因为它们也使用WinDbg,从而转储分析。
Answer 5:
您可以尝试的IntelliTrace提供与Visual Studio的终极版工具。 这是你的描述 - 它记录了什么是你的应用中发生的,并允许您调试它不与鼠标悬停于变量和所有其他调试窗口,以帮助你执行你的计划。
Answer 6:
您可以使用PostSharp 。 我发现,由于环境中的应用部署它非常有用记录调试时间。 和仪表/记录很多东西。
但很明显,你需要指定你需要记录所有变量。
查看更多详情点击这里 。