0

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

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

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

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

4

1 回答 1

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 /

于 2019-08-28T08:58:31.877 回答