在ClrProfiler中,如何从ObjectID获取托管对象

时间:2017-10-05 12:53:32

标签: c++ .net clr-profiling-api

我正在为一些自定义要求构建一个.Net Profiler,我需要捕获异常细节,即使它在代码中得到了正确处理。 为此 -

  • 我已实施ICorProfilerCallback
  • 用于COR_PRF_MONITOR_EXCEPTIONS
  • 的SetEventsMask
  • 实施了ExceptionThrown回调

到目前为止,我正在为每个被抛出的异常进行回调。但是,它给出了OjbectID,它是指向实际异常对象的指针。我想要有关异常的更多详细信息,如消息,调用堆栈等。

如何从ObjectID获取对象详细信息?

1 个答案:

答案 0 :(得分:1)

正如@HansPassant所提到的,你所做的事情就像调试器一样,而不是分析器。但是,如果这是一个很难的要求,你可以使用分析器做你想做的事情 - 我相信IL可以通过settings.py接口重写,但我是一个分析器开发者,并没有使用调试器接口作为得多。

David Broman's blog对使用ICorDebug接口进行托管堆栈遍历有很好的描述。为了获得原生部分,你需要做更多的工作。

也可以通过ICorProfilerInfo2界面导航对象实例。

  1. 使用ICorProfilerInfo2

  2. 获取对象的类ID
  3. 使用班级ID通过ICorProfilerInfo::GetClassFromObject()

    获取班级布局
    • 您需要解析对象元数据以确定所需的字段。
  4. 索引对象以获取所需数据。