В ClrProfiler, как получить управляемый объект из ObjectID

Я создаю .Net Profiler для некоторых пользовательских требований, где мне нужно захватить детали исключения, даже если это было правильно обработано в коде.
Для этого

  • Я реализовал ICorProfilerCallback
  • SetEventsMask для COR_PRF_MONITOR_EXCEPTIONS
  • Реализован обратный вызов ExceptionThrown

Пока все хорошо, я получаю обратный вызов за каждое выбрасываемое исключение. Тем не менее, он дает OjbectID, который является указателем на фактический объект исключения. Я хочу больше подробностей, таких как сообщение, стек вызовов и т. Д. Об исключении.

Как получить информацию об объекте из ObjectID?

0

Решение

Как упомянул @HansPassant, то, что вы делаете, больше напоминает функцию отладчика, чем профилировщик. Тем не менее, вы можете делать то, что вы хотите, используя профилировщик, если это жесткое требование — я считаю, что переписывание IL возможно через ICorDebug интерфейсы, но я разработчик профилировщик и не так часто использовал интерфейсы отладчика.

Блог Дэвида Бромана имеет отличное описание взятия управляемого стека с использованием ICorProfilerInfo2 интерфейс. Для того, чтобы получить родные части, вам нужно сделать гораздо больше работы.

Навигация по экземпляру объекта также осуществляется через ICorProfilerInfo2 интерфейс.

  1. Получить идентификатор класса объекта с помощью ICorProfilerInfo::GetClassFromObject()

  2. Используя идентификатор класса, вы получите макет класса через ICorProfilerInfo2::GetClassLayout()

    • Вам нужно будет проанализировать метаданные объекта, чтобы определить, какое поле вы хотите.
  3. Индекс в объект, чтобы получить нужные данные.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]