【问题标题】:How to get the value from the byte array object using ICorProfilerInfo2如何使用 ICorProfilerInfo2 从字节数组对象中获取值
【发布时间】:2019-12-30 20:01:04
【问题描述】:

我正在使用 ICorProfilerCallback2 接口来分析我的应用程序。在函数输入钩子上,我试图从作为参数传递给函数的字节数组中读取值。我有参数信息 COR_PRF_FUNCTION_ARGUMENT_INFO,我可以从中获取字节数组参数的起始地址。

如果是字符串参数,我可以使用 ICorProfilerInfo2 接口中的“GetStringLayout”方法来获取 bufferoffset 和 stringlengthoffset。

如何找到字节数组的偏移量以及如何从中读取值?

我在哪里可以找到这些文件?

【问题讨论】:

    标签: clr-profiling-api


    【解决方案1】:

    如果您有参数的 ObjectID(或 COR_PRF_FUNCTION_ARGUMENT_RANGE),那么您的生活就会很轻松(至少对于对象/数组,而不是值类型。您必须使用元数据验证参数类型)。

    您可以使用 ICorProfilerInfo::GetClassFromObject 和 ICorProfilerInfo::IsArrayClass 来确定它是否是一个数组。如果是这样,IsArrayClass 会为您提供数组的类型。 .Net 中的数组有一个特定的布局(我不认为它在官方文档中):ClassID 总是 8 个字节,大小是 8 个字节,并且比所有元素都没有填充(注意:对象由 ObjectID 存储,就像在其他内存区域一样)。 也可以使用 ICorProfilerInfo2::GetArrayObjectInfo 获取对象的大小(需要从维度计算)和起始地址。

    相关内容如下: https://mattwarren.org/2017/05/08/Arrays-and-the-CLR-a-Very-Special-Relationship/ https://windowsdebugging.wordpress.com/2012/04/24/memorylayoutofarraysx64/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      相关资源
      最近更新 更多