.NET Profiler进入/离开函数挂钩未调用

时间:2014-02-18 07:54:39

标签: .net clr-profiling-api

我想使用.NET Profiler来跟踪应用程序的被调用函数。我使用CLR Profiler作为模板,但没有更改分析器(项目ProfilerOBJ)本身(GUID除外)。当我尝试分析应用程序时,进入/离开函数挂钩(除了JITCompilationStarted之外的其他回调)是被调用。但是也有一些被调用的回调(例如Shutdown)(它告诉我在过程中加载了探查器)。

我尝试在32位和64位运行进程(64位函数挂钩似乎在某处定义)但没有成功。

我描述的测试应用程序如下:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Press Enter to allocate object");
        Console.ReadLine();
        var obj = new Person();

        Console.WriteLine("Press Enter to call method on allocated object");
        Console.ReadLine();
        obj.Walk();

        Console.WriteLine("Press Enter to exit");
        Console.ReadLine();
    }
}

class Person
{
    private int walked = 0;

    public void Walk()
    {
        this.walked++;
    }
}

我预计至少会调用回调ICorProfilerCallback::ObjectAllocated和进入/离开函数挂钩。但唯一的回调是ICorProfilerCallback::Shutdown

似乎即使原始的CLR分析器的进入/离开函数挂钩也没有被调用(我试图在回调中输出消息)。

我错过了什么?还有更多事情要做,而不是注册进入/离开功能钩子吗?或者我对进入/离开函数钩子做出了错误的假设?

1 个答案:

答案 0 :(得分:1)

我只是read您可以设置其他标志来指定您感兴趣的事件。其中一个是COR_PRF_MONITOR_ENTERLEAVE,它完全符合我的要求。谢谢rubberduck