1

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

  • 我已经实现了 ICorProfilerCallback
  • 为 COR_PRF_MONITOR_EXCEPTIONS 设置事件掩码
  • 实现了 ExceptionThrown 回调

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

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

4

1 回答 1

1

正如@HansPassant 所提到的,您正在做的事情更像是一个调试器功能,而不是一个分析器。但是,如果这是一个硬性要求,您可以使用探查器做您想做的事 - 我相信通过接口重写 IL 是可能的ICorDebug,但我是探查器开发人员并且没有使用调试器接口。

David Broman 的博客ICorProfilerInfo2对使用该界面进行托管堆栈遍历进行了很好的描述。为了获得原生部分,您需要做更多的工作。

导航对象实例也是通过ICorProfilerInfo2接口完成的。

  1. 使用获取对象的类 IDICorProfilerInfo::GetClassFromObject()

  2. 使用类 ID 通过ICorProfilerInfo2::GetClassLayout()

    • 您将需要解析对象元数据以确定您想要的字段。
  3. 索引到对象以获取所需的数据。

于 2017-10-05T20:11:49.867 回答