哪些MDA对跟踪堆损坏有用?

时间:2011-09-26 18:15:55

标签: c# .net debugging heap-corruption

我在.NET / C#程序中有堆损坏,无法使用WinDbg + PageHeap + Application Verifier跟踪它。在下一步中,我计划使用Managed Debugging Assistants(MDA)。

目前我尝试使用这些MDA:

<gcManagedToUnmanaged />
<gcUnmanagedToManaged />
<invalidVariant />

(启用这些MDA会使程序运行得非常慢。)

在这种情况下还有其他我可以尝试的吗?

2 个答案:

答案 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

的文章