【问题标题】:Parsing the COR_PRF_FUNCTION_ARGUMENT_INFO Structure解析 COR_PRF_FUNCTION_ARGUMENT_INFO 结构
【发布时间】:2021-03-10 19:13:53
【问题描述】:

我想知道如何解析 COR_PRF_FUNCTION_ARGUMENT_INFO 结构,该结构提供给 SetEnterLeaveFunctionHooks3WithInfo 函数的回调方法。

据我了解,该结构包含一组内存地址,其中包含函数参数值的位置。关于这个结构的信息可以在这里找到:https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/cor-prf-function-argument-info-structure

我还解析了函数的元数据,以确定提供给函数的参数数量和每个参数的类型。我使用了IMetaDataImport接口的GetMethodProps函数。

我不知道下一步该做什么,我将如何继续使用 COR_PRF_FUNCTION_ARGUMENT_INFO 结构获取每个参数的实际值?我是否需要确定每个参数的大小来计算每个参数的内存地址的偏移量? 感谢您的帮助

【问题讨论】:

  • 这是一个可变大小的数组,大小存储在numRanges中。每个参数都包含一个指针和一个大小,请参阅docs。你目前有什么代码可以让你的回调到位?
  • @Charlieface 感谢您的回复。我了解结构是如何构建的,如果这引起了一些混乱,我很抱歉。但是假设在 range[0].startAddress 处,我如何知道每个参数在该地址读取多少字节?
  • 我想你还是需要知道参数类型是什么,不知道你从哪里得到这些信息
  • @Charlieface 我也有参数类型。我只需要弄清楚每个参数类型的大小吗?不知道我会怎么做。
  • sizeof?您使用 C# 还是 C++ 工作?

标签: .net clr clr-profiling-api clrprofiler


【解决方案1】:

您应该能够根据参数的类型计算出每个参数的大小以及如何解释它:

  • 如果它是原始值类型,那么大小和表示应该是不言而喻的。 (int => '4 byte integer', double => '8 byte floating point', bool => '4 byte integer where 0 is false and all other is true', IntPtr => 'pointer-sized integer')李>
  • 如果它是一个引用类型,那么它将是一个指针大小的 ObjectID。 (警告:ObjectID 在回调之间会发生变化,所以不要试图挂在它们上面,除非你还挂钩了 GC 回调并在对象移动时更新它们)。
  • 如果它是一个值类型,那么您应该能够使用GetClassLayout 来获取值的大小和其中字段的位置。
  • 如果它是通过引用传递的,那么它将是一个(指针大小的)指针,指向存储实际值的内存位置(或者在输出参数的情况下将被存储)。

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 2014-08-06
    • 2019-01-20
    • 2019-01-17
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多