【发布时间】:2015-07-03 07:22:09
【问题描述】:
我的代码结构如下:
class A {
void M() {}
}
delegate void B<T1,T2>(T1 key, T2 value);
我正在使用 ICorProfiler2 API 来分析该代码。现在,当方法 M 被 jitted 时,我得到一个 FunctionID* 指向其 ID 的指针。然后我执行以下操作(高度缩写):
mdToken functionToken = mdTypeDefNil;
mdTypeDef classToken = mdTypeDefNil;
IMetaDataImport* pMDImport = NULL;
profilerInfo->GetTokenAndMetaDataFromFunction(functionId,
IID_IMetaDataImport, (IUnknown**) &pMDImport, &functionToken);
pMDImport->GetMethodProps(functionToken, &classToken, functionName,
sizeof(functionName), 0, &methodAttr, &sigBlob, &sigSize, NULL,
NULL);
这在变量 classToken 中给了我一个 TypeToken。
我预计这是 M 在源中声明的类型(又名 A 类),但我收到了委托 B 的类型标记。所以我的问题是:我做错了什么还是我假设 GetMethodProps 返回 M 的定义类型的类型标记错误?
很遗憾,GetMethodProps 的文档帮助不大:https://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx
编辑: 澄清一下:我知道返回了错误的类型,因为我生成了一个包含所有类型/函数标记及其映射到的名称的文件。我用ILSpy 验证了这些令牌:它们是正确的。这种映射也已经在其他应用程序中进行了多次测试,并且似乎工作得很好,所以我认为这不是问题的根源。
【问题讨论】:
-
您确定您没有混合功能令牌吗?因为它很可疑……你收到的
functionName是正确的吗? -
尚未检查名称,但我没有将函数标记存储在字段/映射/数组等中,并且这两个调用在代码中紧随其后。所以我看不出我怎么会传递错误的函数令牌。我还检查了第一次调用的 HRESULT 以确保它成功。
-
那你怎么知道你在跳什么方法呢?请注意,委托内部有方法......自动生成的方法。请参阅goo.gl/ZWsHcO(右窗格)
-
我有一个文件,其中包含从类型/功能标记到它们的名称的映射,用于分析的二进制文件,因此我可以查找每个标记对应的类型或功能。我知道自动生成的方法,但它们有不同的标记:/
-
那个“文件”听起来很可疑,它如何处理泛型方法? M() 将有多个副本。我会随机猜测您正在寻找 ICorProfilerInfo2::GetFunctionInfo2() 以便您知道类型参数。
标签: c# .net profiling clr-profiling-api