c# - ICorProfiler : Why do I get the wrong type token for a jitted function?

标签 c# .net profiling clr-profiling-api

我的代码结构如下:

class A {
    void M() {}
}
delegate void B<T1,T2>(T1 key, T2 value);

我正在使用 ICorProfiler2 API 来分析该代码。现在,当方法 M 被调用时,我得到一个指向其 ID 的 FunctionID* 指针。然后,我执行以下操作(大大缩写):

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),但我收到的是委托(delegate) B 的类型标记。所以我的问题是:是我做错了什么,还是我假设 GetMethodProps 返回 M 的定义类型的类型标记错误?

不幸的是,GetMethodProps 的文档不是很有帮助:https://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx

编辑: 澄清一下:我知道返回了错误的类型,因为我生成了一个包含所有类型/函数标记及其映射到的名称的文件。我用 ILSpy 验证了这些标记: 他们是对的。此映射也在其他应用程序中经过多次测试,似乎工作正常,所以我认为这不是问题的根源。

最佳答案

到目前为止,还没有人能够解释为什么会发生这种情况。我的所有调查使我相信探查器 API 有时只是报告方法的错误类型。

幸运的是,方法标记在整个程序集中是唯一的,因此我们现在使用这些 + 程序集名称来唯一标识每个方法并完全忽略类型标记。

关于c# - ICorProfiler : Why do I get the wrong type token for a jitted function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200934/

相关文章:

c# - 如何从 C# 中的 Excel 工作簿中删除工作表?

c# - SQL Server 插入

c# - 递归算法中出现大数时出现 StackOverflowException。优化?

c# - DbContext.SaveChanges() 没有更新数据库

c# - 如何从 C# 分析内存和 CPU 使用情况

c# - 动态日志框架或技术

c# - 反射 - 获取 lambda 表达式中的方法调用列表

c# - 使用忽略重载的 lambda 语法选择方法表达式

ruby - 了解 ruby​​-prof 输出

performance - 在 Chrome devtools 时间轴上自动化/重播