Я получил адрес большого управляемого объекта в WinDbg, что дальше? - PullRequest
0 голосов
/ 24 июня 2009

Я создал дамп с высоким использованием памяти и, используя! Dumpheap -stat и! Dumpheap -mt, получил адрес двух больших строковых общих списков по 30 МБ каждый.

Я хочу узнать больше об этих списках. Что они содержат или какой код использует их.

Есть ли способ узнать их?

0: 000>! Do 2b370038 Имя: System.Object [] MethodTable: 71e240bc EEClass: 71c0da54 Размер: 33554448 (0x2000010) байтов Массив: ранг 1, количество элементов 8388608, тип CLASS Тип элемента: System.Collections.Generic.List`1 [[System.String, mscorlib]] Поля: Ни один

Ответы [ 2 ]

1 голос
/ 10 июля 2009

Чтобы получить информацию об экземплярах массива, вы можете использовать команду !dumparray с флагом -details. Имейте в виду, однако, что выгрузка всего массива может занять некоторое время и вывести много текста.

Чтобы узнать, как сохранить экземпляры живыми, используйте команду !gcroot. Вы также можете проверить команду !refs из sosex.dll.

sosex.dll также имеет команду !gcgen, которая может сообщить вам генерацию экземпляров. IIRC соответствующая команда была добавлена ​​в версию sos.dll для CLR 4.0.

0 голосов
/ 24 июня 2009

Я рекомендую вам попробовать .Net Memory Profiler (http://memprofiler.com) для изучения управляемых дампов памяти. Это намного проще, чем windbg. Хороший графический интерфейс, который вы можете использовать для поиска и изучения графиков ссылок. также смотрите значения полей 'instance'.

...