我正在使用ICorProfilerCallback2接口来分析我的应用程序。在函数输入钩子上,我正在尝试从作为参数传递给函数的字节数组中读取值。我有参数信息COR_PRF_FUNCTION_ARGUMENT_INFO,从中我可以获取字节数组参数的起始地址。
如果它是一个字符串参数,我可以使用 ICorProfilerInfo2 接口中的"GetStringLayout"方法来获取缓冲区偏移量和字符串长度偏移量。
如何找到字节数组的偏移量以及如何从中读取值?
我在哪里可以找到这些文件?
如果你有参数的 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/