Любой способ создать дамп/гистограмму кучи для OutOfMemoryException в C#?

Вернувшись в мир Java, я смог указать, что JVM должна создавать файл дампа кучи при первой ошибке OutOfMemoryError. Есть ли что-нибудь эквивалентное в C#?

Дамп кучи был бы идеальным, но я бы согласился на гистограмму.

Если нет способа сделать это автоматически, есть ли способ перехватить это исключение, а затем вручную пройти кучу?


person chillitom    schedule 11.03.2012    source источник
comment
stackoverflow.com/questions/4123021/   -  person Mitch Wheat    schedule 11.03.2012
comment
stackoverflow.com/questions/1721111/   -  person pavel.baravik    schedule 11.03.2012


Ответы (2)


Вы можете использовать утилиту MS Debugging tools ADPlus, чтобы получить дамп процесса, включающий все кучи. Затем с помощью WinDBG.exe (также в средствах отладки) вы можете использовать команду !DumpHeap для получения всех необходимых данных.

немного старая, но полезная ссылка HOWTO

person Menahem    schedule 11.03.2012
comment
Спасибо, @Menahem, хорошее предложение, однако мне бы очень хотелось что-то, что могло бы записывать вывод на машинах пользователей, в то время я не смогу подключить отладчик. - person chillitom; 11.03.2012
comment
@chillitom, в этом случае вы можете настроить отладчик для автоматического создания дампа на клиентской машине, когда это произойдет. затем скопируйте дамп на машину, где вы сможете его проанализировать. Митч Уит разместил ссылку на описание того, как это сделать. - person Menahem; 11.03.2012

Я бы использовал procdump, потому что вы можете легко настроить его перед сбоем для дампа память при сбое. Затем используйте windbg для просмотра памяти.

Я бы добавил, что если сразу не очевидно, куда уходит память (используя команду инструментов sos.dll !dumpheap -stat), то вы можете использовать procdump для создания нескольких аварийных дампов через определенные промежутки времени, чтобы отслеживать, какие память растет.

Если вы не знакомы с windbg и sos, вам может понадобиться проверьте это.

person Davin Tryon    schedule 11.03.2012