如何使用转储文件诊断内存泄漏?如何使用转储文件诊断内存泄漏?(How do I use a dump

2019-05-12 21:30发布

我有一个正常的专用工作组的约80 MB的一个.NET服务。 在最近的负载测试,过程中达到了3.5 GB的内存使用情况造成整个机器要低物理内存(3.9 4 GB的使用),并负载测试停止后内存未释放长。 使用任务管理器,我把过程的转储文件,并在Visual Studio 2010 SP1打开一看,我能够在它开始调试。

如何诊断内存问题? 我有dotTrace内存3.x的在我手上,它支持在转储文件内存分析? 如果不是,将内存分析的Visual Studio 2010中的高级的帮助功能(我现在有专业)? WinDbg的帮助?

更新:的Visual Studio 2013旗舰版现在可以本机使用诊断转储文件存储的问题。 请参见这篇博客了解更多详情。

Answer 1:

安装的WinDbg。 你需要确保你根据你的转储的正确版本x86或x64。 这里是一个直接链接到下载用于x86。

关于这一点,你需要确保你把正确的转储。 您可以使用任务管理器来创建转储文件(右键单击程序 - >创建转储文件)。 如果你在64位和你的过程是86使用任务管理器(C:\ WINDOWS \ Syswow64资料\的TaskMgr.exe)的32位版本,以转储文件。 请参阅我的文章服用转储文件,例如,如果你在XP,需要使用WinDbg创建转储文件的更多信息。

警告有一个相当陡峭的学习曲线,事情可能无法正常工作完全按照这里介绍所以回来任何问题。

我假设你正在使用.NET4给你可以打开Visual Studio中的转储。 这里是一个非常快速指南,以帮助您与您的dmp文件的工作:

1)运行WinDbg中,符号集路(文件 - >符号搜索路径)

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

2)打开崩溃转储或者拖动.dmp文件到WinDbg的。

3)键入此到命令窗口

.loadby sos clr

(仅供参考,用于.NET 2,命令应该是.loadby sos mscorwks

4)然后输入此

!dumpheap -stat

其中列出了对象及其数量的类型。 看起来是这样的:

你必须分析这个在您的应用程序的情况下,看有无出现异常。

还有很多更多的WinDbg的,谷歌是你的朋友。



Answer 2:

一般来说,如果你有一个托管应用程序泄漏,这意味着什么是没有得到收集。 常见来源包括

  • 事件处理程序:如果用户不删除出版商将抓住它。

  • 静力学

  • 终结:一个封闭终结将防止运行的任何其他终结终结器线程,从而防止这些情况下被回收。

  • 同样,死锁的线程将抓住它持有任何根基。 当然,如果你已经陷入僵局,可能会影响在几个层次上的应用程序线程。

要解决这一点,你需要检查托管堆。 WinDbg的+ SOS(或PSSCOR)将让你做到这一点。 该!dumpheap -stat命令列出了整个托管堆。

你需要有各类型的实例数量的一个想法,希望在堆上。 一旦你找到的东西,看起来很奇怪,你可以使用!dumpheap -mt <METHOD TABLE>命令可以列出一个给定类型的所有实例。

下一个步骤是分析这些实例的根。 随机挑选一个并做了!gcroot上。 这将表明,特定的实例是如何扎根。 寻找事件处理程序和固定的对象(通常代表静态引用)。 如果你看到了终结队列中有你需要检查什么终结线程正在做什么。 使用!threads!clrstack命令为。

如果一切正常你移动到另一个实例的实例。 如果不产生任何你可能需要回去在堆再看看,并从那里重复。

泄漏的其他来源包括:未卸载和大对象堆的碎片大会。 SOS / PSSCOR可以帮你找到这些为好,但我会跳过细节现在。

如果你想知道更多,我建议苔丝的博客 。 我也做了几个涉及如何使用WinDbg + SOS(视频这里和这里 )。

如果你同时运行调试过程中的选择,我建议使用PSSCOR而不是SOS。 PSSCOR本质上是已经得到增强,附加命令和许多现有的SOS命令已得到改进,以及在SOS来源私有分支。 例如PSSCOR版的!dumpheap命令有一个非常有用的三角柱,这使得解决内存泄漏容易得多。

为了使用它,你需要开始你的过程中,连接WinDbg和加载PSSCOR,并做了!dumpheap -stat 。 然后你让进程再次运行这样的分配制成。 打破执行和重复命令。 现在PSSCOR会告诉你添加/删除自上次检查该实例的数量。



Answer 3:

由于版本2017.2 JetBrains公司dotMemory支持Windows内存转储以其实力和花哨的GUI分析。



Answer 4:

http://msdn.microsoft.com/en-us/library/ee817660.aspx

微软有一个莅临指导。 然而,对于初学者来说太艰难。

dotTrace可产生视觉记忆图表(比WinDbg的更好),但从来没有使用它垃圾堆。



文章来源: How do I use a dump file to diagnose a memory leak?