2014-02-18 12 views
2

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

我试着在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

我只是read,您可能会设置其他标志来指定您感兴趣的事件。其中之一是COR_PRF_MONITOR_ENTERLEAVE这正是我正在寻找。谢谢rubberduck