Какие MDA полезны для отслеживания повреждения кучи? - PullRequest
1 голос
/ 26 сентября 2011

У меня повреждение кучи в программе .NET / C # и я не могу отследить его с помощью WinDbg + PageHeap + Проверка приложения, На следующем этапе я планирую использовать Managed Debugging Assistants (MDAs).

В настоящее время я пытаюсь использовать следующие MDA:

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

(При включении этих MDA программа работает очень медленно.)

Могу ли я попробовать что-нибудь еще в этом случае?

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Как отметил Ханс Пассант, основным MDA для таких случаев будет <gcUnmanagedToManaged>.Однако этот MDA делает программу очень медленной.На самом деле, программа становится непригодной для использования (для рисования интерфейса программы требуется «навсегда»), поэтому она не будет работать в производственной среде.Визуально этот MDA работает так же медленно, как и GCStress.

Другие полезные MDA (работа должна выполняться быстрее):

<callbackOnCollectedDelegate />
<invalidOverlappedToPinvoke />
<overlappedFreeError />

Чтобы узнать больше о доступных MDA и их подробном описании, обратитесь к статье MSDN Диагностика ошибок с помощью управляемых помощников отладки .

Хорошая статья о том, как установить MDA для программы, - Управляемые помощники отладки в .NET 2.0 .

И, наконец, как активировать MDA в системе, см. Вопрос переполнения стека .NET / C #: Как установить переменную среды отладки COMPLUS_HeapVerify? .

0 голосов
/ 26 сентября 2011

Попробуйте один из коммерческих инструментов, таких как ANT's Memory Profiler или Jetbrain's DotTrace от Red Gate. Я использую ANTs Memory Profiler и смог обнаружить утечки памяти и исправить код, который вызывал утечки памяти, что в конечном итоге может привести к повреждению кучи. Вот статья о обнаружении утечек памяти с помощью ANTs Memory Profiler

...