gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:08:46 24 4
gpt4 key购买 nike

我正在为一些自定义需求构建一个 .Net Profiler,我需要在其中捕获异常详细信息,即使它已在代码中得到正确处理。这样做-

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

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

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

最佳答案

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

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

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

  1. 使用 ICorProfilerInfo::GetClassFromObject()

    获取对象的类 ID
  2. 使用类 ID 通过 ICorProfilerInfo2::GetClassLayout() 获取类布局

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

关于c++ - 在 ClrProfiler 中,如何从 ObjectID 获取托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46586119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com