现在可能会有一些新工具 – 也许是更新后的Visual Studio中的一些东西,我很想找到这些,但我之前尝试过WinDbg取得了一些成功.以下是关于如何做到这一点的旧笔记:
1. Create dump file from process manager 2. Run WinDbg (X64) 3. File/Open Crash Dump… (Crtl+D) 4. Run following: lm .load C:\windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll .sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols .symfix .reload !dumpheap -stat
请注意,如果您的进程是x86,特别是如果您在x64版本的Windows上运行 – 您将需要使用x86版本的调试器(WinDbg同时提供两个版本)来保存转储. SOS是WinDbg的托管内存调试扩展,不支持调试x86位进程的x64位转储.然后,您还需要分别更新sos路径,因此它看起来像这样:
.load C:\windows\Microsoft.NET\Framework\v4.0.30319\sos.dll
可能并非所有这些命令都是必要的,但这对我有用.
现在,您可以找到似乎存在于太多实例中的对象类型
!DumpHeap -type TypeName
其中type name只是类型的名称 – 不需要完全限定的命名空间.
现在,您可以检查将此对象保留在内存中的内容:
!GCRoot Object_Address
实时调试对我来说不起作用,因为当您附加调试器时应用程序似乎被暂停.我想我在某个地方看到了一个让应用程序保留在内存中的选项,但是我忘了在哪里,但是对于内存分析 – 查看静态转储文件可能就足够了.
您可以从here下载WinDbg作为Windows SDK的一部分,也可以单独下载“Windows调试工具”.
要创建转储文件 – 转到任务管理器,右键单击进程并选择“创建转储文件”.
更多链接:
http://msdn.microsoft.com/en-us/library/bb190764.aspx
*编辑
根据.NET Memory Allocation Profiling with Visual Studio 2012由Stephen Toub-PerfView工具支持分析.NET Windows应用商店应用程序中的泄漏.查看Vance Morrison here的文章和视频演练.
*编辑2
Visual Studio 2013 Preview添加了一个新选项,用于分析转储文件中的托管内存堆.要做到这一点 – 只需在Visual Studio调试器中暂停您的应用程序,通过Debug / Save Dump As保存当前转储,然后恢复执行并使用您的应用程序直到您的疑似泄漏发生并再次进行转储.然后转到文件/打开/文件并打开第二个转储文件.在“操作”面板的“转储摘要”右侧,您将看到“调试管理内存”操作.选择该选项,然后在“选择基准”中选择您的第一个转储文件.您将看到托管堆上的对象列表,按类型分组,具有计数差异.请注意,您通常会先查看具有低,非零计数差异的对象,以跟踪单个泄漏源.您可以通过在“参考图形”视图中展开树来深入查看对象列表并查看将它们保留在内存中的内容.