在托管的.NET应用程序中查找本机内存泄漏,DebugDiag缺少堆栈跟踪

时间:2014-12-30 21:34:57

标签: .net memory memory-leaks windbg debugdiag

DebugDiag中的LeakTrack没有捕获堆栈跟踪,因此不确定从何处开始。

我有一个内存泄漏的.NET应用程序(作为Windows服务运行的NServiceBus进程)。在5-6天的过程中增长到大约10GB。

我在WinDbg中使用!address –summary进行了procdump和基本分析。我看到堆提交大小为8.6GB。

接下来,我在转储上运行DebugDiag以获取托管内存。在托管内存中根本没有红色标记,因此我尝试查看本机分配。

所以我在DebugDiag(2.1.0.7)中选择了

  

在监控泄漏时立即记录调用堆栈(AKA" FastTrack")注意:监控超过15分钟时不建议使用)

然后我跑了30分钟(与警告相反)。运行分析时,我收到一条消息,说它无法获得调用堆栈,因为我要么运行时间超过15分钟(我没有),要么我需要设置"开始记录调用堆栈立即" (我做过)。

所以,我决定再试一次。我这次设置它运行2个小时,并没有将它设置为"立即开始录制"。同样的消息。

enter image description here

enter image description here

这是来自9GB procdump的虚拟内存摘要(没有运行泄漏检测)

enter image description here

那么从DebugDiag获取调用堆栈需要做什么?我的罪魁祸首似乎是在坚定的记忆中(我不确定我是否真的理解在这种情况下保留与承诺)。但不知道如何确定罪魁祸首是什么。

也不确定为什么DebugDiag认为有8TB内存(这是在虚拟机上运行,​​不确定是否相关)。

1 个答案:

答案 0 :(得分:0)

你可以使用WPA(Windows性能分析器)可以通过使用虚拟alloc配置文件获取VirtualAlloc跟踪这里是一个9分钟的视频,解释了VirtualAlloc相关问题的分析示例

使用Windows性能分析器了解VirtualAlloc使用情况 http://channel9.msdn.com/events/Build/BUILD2011/HW-977P