Есть ли в .NET API способ перебора управляемых объектов, присутствующих в управляемой куче?
Мы бы хотели добавить в некоторые моменты нашей программы подпрограмму, которая проверяет наличие некоторых объектов в управляемой куче.
Установите «Средства отладки для Windows».
а. Ссылка: http://www.microsoft.com/whdc/devtools/debugging/default.mspx
б. Вы будете использовать WinDbg.EXE, собственный отладчик Windows и SOS.DLL (a.k.a. «Сын забастовки»), расширение WinDbg для управляемого кода.
с. Расположение по умолчанию: «C: \ Program Files \ Средства отладки для Windows».
Запустите управляемый процесс.
Запустите WinDbg и нажмите «Файл -> Присоединить к процессу…»
Выберите ваш процесс из списка.
WinDbg автоматически прервет (остановит) выполнение при подключении к вашему процессу.
Введите «.load sos.dll» (да, с предыдущим ‘.’) В командной строке WinDbg для загрузки Son of Strike.
Введите "! Help", чтобы увидеть список команд / функций, которые предлагает Son of Strike.
Введите "! Traverseheap –xml heap.xml", чтобы выгрузить кучу вашего процесса в heap.xml в каталоге WinDbg (например, C: \ Program Files \ Debugging Tools for Windows ").
а. Обход и выгрузка кучи в файл может занять очень и очень много времени. WinDbg отправит " BUSY " в свой статус и напечатает "." - s, чтобы указать прогресс.
б. В общем случае heap.xml имеет следующую структуру:
<Тип ID> ... <Объекты> Каждый класс (тип) содержит идентификатор, а каждый объект - идентификатор типа, управляемый адрес и размер.
<Тип ID>
...
<Объекты>
Каждый класс (тип) содержит идентификатор, а каждый объект - идентификатор типа, управляемый адрес и размер.
Используйте findstr (командную строку) для файла heap.xml, чтобы пройти через кучу, и WinDbg для сброса объектов.
а. Пример: найдите идентификатор типа класса DataTable.
findstr "DataTable" heap.xml
Вывод:
б. Пример: Найти все объекты DataTable.
findstr "typeid = \" 1002 \ "" heap.xml
с. Пример: дамп объекта DataTable.
.
Добавьте, если вы хотите отслеживать распределение больших объектов, вот как разбить CLR на выделение LOH. При взломе нажмите «k», чтобы увидеть стек вызовов.
Запустите WinDbg и присоедините, как показано ниже.
Для этого вам понадобится API отладки / профилирования , который я бы не рекомендовал для "нормального" приложения.