В ClrProfiler, как получить управляемый объект из ObjectID
Я создаю.Net Profiler для некоторых пользовательских требований, где мне нужно захватить детали исключения, даже если это было правильно обработано в коде. Для этого
- Я реализовал ICorProfilerCallback
- SetEventsMask для COR_PRF_MONITOR_EXCEPTIONS
- Реализован обратный вызов ExceptionThrown
Пока все хорошо, я получаю обратный вызов за каждое выбрасываемое исключение. Тем не менее, он дает OjbectID, который является указателем на фактический объект исключения. Я хочу больше подробностей, таких как сообщение, стек вызовов и т. Д. Об исключении.
Как получить информацию об объекте из ObjectID?
1 ответ
Как упомянул @HansPassant, то, что вы делаете, больше напоминает функцию отладчика, чем профилировщик. Тем не менее, вы можете делать то, что вы хотите, используя профилировщик, если это жесткое требование - я считаю, что переписывание IL возможно через ICorDebug
интерфейсы, но я разработчик профилировщик и не так часто использовал интерфейсы отладчика.
В блоге Дэвида Бромана есть отличное описание того, как проходить управляемый стек, используя ICorProfilerInfo2
интерфейс. Для того, чтобы получить родные части, вам нужно сделать гораздо больше работы.
Навигация по экземпляру объекта также осуществляется через ICorProfilerInfo2
интерфейс.
Получить идентификатор класса объекта с помощью
ICorProfilerInfo::GetClassFromObject()
Используя идентификатор класса, вы получите макет класса через
ICorProfilerInfo2::GetClassLayout()
- Вам нужно будет проанализировать метаданные объекта, чтобы определить, какое поле вы хотите.
Индекс в объект, чтобы получить нужные данные.