Как перебирать объекты, присутствующие в управляемой куче .NET? - PullRequest
2 голосов
/ 28 января 2009

Есть ли в .NET API способ перебора управляемых объектов, присутствующих в управляемой куче?

Мы бы хотели добавить в некоторые моменты нашей программы подпрограмму, которая проверяет наличие некоторых объектов в управляемой куче.

Ответы [ 2 ]

6 голосов
/ 28 января 2009
  1. Установите «Средства отладки для Windows».

    а. Ссылка: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

    б. Вы будете использовать WinDbg.EXE, собственный отладчик Windows и SOS.DLL (a.k.a. «Сын забастовки»), расширение WinDbg для управляемого кода.

    с. Расположение по умолчанию: «C: \ Program Files \ Средства отладки для Windows».

  2. Запустите управляемый процесс.

  3. Запустите WinDbg и нажмите «Файл -> Присоединить к процессу…»

  4. Выберите ваш процесс из списка.

  5. WinDbg автоматически прервет (остановит) выполнение при подключении к вашему процессу.

  6. Введите «.load sos.dll» (да, с предыдущим ‘.’) В командной строке WinDbg для загрузки Son of Strike.

  7. Введите "! Help", чтобы увидеть список команд / функций, которые предлагает Son of Strike.

  8. Введите "! Traverseheap –xml heap.xml", чтобы выгрузить кучу вашего процесса в heap.xml в каталоге WinDbg (например, C: \ Program Files \ Debugging Tools for Windows ").

    а. Обход и выгрузка кучи в файл может занять очень и очень много времени. WinDbg отправит " BUSY " в свой статус и напечатает "." - s, чтобы указать прогресс.

    б. В общем случае heap.xml имеет следующую структуру:

    <Тип ID>

    ...

    <Объекты>

    Каждый класс (тип) содержит идентификатор, а каждый объект - идентификатор типа, управляемый адрес и размер.

  9. Используйте findstr (командную строку) для файла heap.xml, чтобы пройти через кучу, и WinDbg для сброса объектов.

    а. Пример: найдите идентификатор типа класса DataTable.

    • findstr "DataTable" heap.xml

      Вывод:

    б. Пример: Найти все объекты DataTable.

    • findstr "typeid = \" 1002 \ "" heap.xml

      Вывод:

    с. Пример: дамп объекта DataTable.

    • (в WinDbg)! Dumpobj 0137ecd8
    * 1 089 * d. Пример. Дамп объекта-члена. Адрес объекта-члена хранится в поле «Значение» дампа, содержащего объект-член.
    • ! Dumpobj <"Значение">

.

Добавьте, если вы хотите отслеживать распределение больших объектов, вот как разбить CLR на выделение LOH. При взломе нажмите «k», чтобы увидеть стек вызовов.

Запустите WinDbg и присоедините, как показано ниже.

  1. Добавьте сервер символов Microsoft в путь символов:
  2. Перезагрузить символы:
    • .reload
  3. Перезагрузка среды выполнения:
    • .reload / f mscorwks.dll
  4. Перерыв на выделение UP:
    • bp mscorwks! WKS :: gc_heap :: allocate_large_object
  5. Перерыв в распределении MP:
    • bp mscorwks! SVR :: gc_heap :: allocate_large_object
  6. Подтвердите контрольные точки:
    • бл
  7. Резюме:
3 голосов
/ 28 января 2009

Для этого вам понадобится API отладки / профилирования , который я бы не рекомендовал для "нормального" приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...