我在.NET/C#程序中有一个堆损坏的,不能用WinDbg + PageHeap + 应用验证器跟踪它。在下一步中,我计划使用托管调试助理 (MDA)。
目前,我尝试使用这些MDA:
<gcManagedToUnmanaged />
<gcUnmanagedToManaged />
<invalidVariant />
(启用这些MDA使程序运行得非常慢。)
在这种情况下我还能试试别的什么吗?
发布于 2011-10-07 18:09:50
正如汉斯·帕桑特所指出的,这类病例的主要丙二醛是<gcUnmanagedToManaged>
。但是,这种MDA会使程序运行得非常慢。实际上,程序变得不可用(绘制程序接口需要“永远”),因此在生产中无法工作。从视觉上看,这个MDA和GCStress一样慢。
其他有用的MDA(工作必须更快):
<callbackOnCollectedDelegate />
<invalidOverlappedToPinvoke />
<overlappedFreeError />
要了解更多关于可用MDA及其详细描述的信息,请参阅MSDN文章http://msdn.microsoft.com/en-us/library/d21c150d.aspx。
关于如何为程序设置MDA的一篇好文章是http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=500。
最后,如何激活系统中的MDA,参见堆栈溢出问题HeapVerify?。
发布于 2011-09-26 18:56:08
尝试一种商业工具,如Red的蚂蚁记忆分析器或Jetbrain的DotTrace。我使用蚂蚁内存分析器,能够检测内存泄漏并修复导致内存泄漏的代码,这可能最终导致堆损坏。这是一篇关于使用蚂蚁内存分析器查找内存泄漏的文章
https://stackoverflow.com/questions/7559374
复制相似问题