.Net Profiling - 了解托管线程的开始和结束

时间:2014-10-31 09:09:31

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

我正在开发一个.Net探查器..我使用ILRewriting来实现..

我需要跟踪托管的线程创建并销毁。

需要知道将在线程开头调用的线程相关函数,并且在线程结束期间,我可以将代码注入其中并在事件发生时进行记录。

关于默认函数的任何想法,将在创建线程时调用并结束.. ??

或者有没有其他方法来捕获托管线程创建和销毁事件?

我知道我们可以通过设置线程事件掩码进行跟踪..但我需要捕获特定的托管线程而不是所有线程..

1 个答案:

答案 0 :(得分:2)

正如Hans所指出的,CLR使用ThreadCreatedThreadDestroyed回调通知分析器线程创建/销毁。注意:如果运行时在线程终止之前关闭,那么您将无法获得ThreadDestroyed回调...但我认为您没有获得ThreadDestroyed回调的可能性更大的原因是IIS(我假设是'页面加载'你指的是asp .NET页面)决定保留线程以便将来的请求作为优化,如果它认为它有足够的其他线程,它可能决定稍后终止它。

此外,关于您对该问题的第二条评论,ThreadID与ManagedThreadID之间没有任何关系。我相信ThreadID是对内部数据结构的引用(将其视为不透明值,不要试图解释它),ManagedThreadID似乎是一个简单的数字,顺序分配为线程首先输入托管代码。如果您想要识别哪个ThreadID与哪个托管线程相对应,我可以考虑3个选项:

  • 使用ThreadNameChanged回调检查线程名称(注意:如果线程名称在线程启动之前设置,那么这将在ThreadCreated回调之前引发)
  • 使用ThreadAssignedToOSThread回调
  • 检查操作系统线程ID
  • 将配置文件代码调用到分析器中以向其提供上下文(使用pinvoke或通过调用为此目的而检测的方法)。