我在.NET / C#程序中有堆损坏,无法使用WinDbg + PageHeap + Application Verifier跟踪它。在下一步中,我计划使用Managed Debugging Assistants(MDA)。
目前我尝试使用这些MDA:
<gcManagedToUnmanaged />
<gcUnmanagedToManaged />
<invalidVariant />
(启用这些MDA会使程序运行得非常慢。)
在这种情况下还有其他我可以尝试的吗?
答案 0 :(得分:3)
正如Hans Passant指出的那样,此类案件的主要MDA将是<gcUnmanagedToManaged>
。但是,这个MDA使程序运行得非常慢。实际上,程序变得无法使用(绘制程序界面需要“永远”),因此它无法在生产中使用。在视觉上,这个MDA和GCStress一样慢。
其他有用的MDA(工作必须更快):
<callbackOnCollectedDelegate />
<invalidOverlappedToPinvoke />
<overlappedFreeError />
要详细了解可用的MDA及其详细说明,请参阅MSDN文章 Diagnosing Errors with Managed Debugging Assistants 。
关于如何为程序设置MDA的好文章是 Managed Debugging Assistants in .NET 2.0 。
最后,如何在系统中激活MDA,请参阅Stack Overflow问题.NET/C#: How to set debugging environment variable COMPLUS_HeapVerify?。
答案 1 :(得分:0)
尝试使用其中一种商业工具,例如Red Gate的ANT's Memory Profiler或Jetbrain的DotTrace。我使用ANTs Memory Profiler并能够检测内存泄漏并修复导致内存泄漏的代码,这可能最终导致堆损坏。这是关于finding memory leaks using ANTs Memory Profiler
的文章