2014-10-31 60 views
0

我开发一个.net探查..我用ILRewriting这个..净剖析 - 了解托管线程开始和结束

我需要跟踪管理线程创建和销毁。

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

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

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

我知道,我们可以通过设置线程事件掩码跟踪..但我需要捕捉特定的管理线程并不是所有的线程..

+2

您不使用IL重写来编写分析器。您使用CLR的内置支持进行分析。 ICorProfilerCallback :: ThreadCreated()和ThreadDestroyed告诉你你需要什么。 – 2014-10-31 11:49:04

+0

没关系@HansPassant ..但是,即使在页面加载完成后,即使在调用'unloadrecursive'之后,主线程(启动页面加载)也不会被破坏。我不知道什么是问题用它。 – 2014-10-31 12:11:26

+0

还有一件事..据我了解,我知道'ThreadID'进入探查器的ThreadCreated'函数是一个ManagedThreadID ..但是对于相同的线程,如果我得到的C#代码ManagedThreadID是一些其他数字,例如。 10或11。使用'CurrentThread.ManagedThreadID'。那么这里是哪些是managedthread id .. ??我很困惑.. – 2014-10-31 12:15:47

回答

2

正如汉斯指出的那样,CLR通知线程创建的分析器/销毁使用ThreadCreatedThreadDestroyed回调。注意:如果在线程终止之前运行时关闭,那么你将不会得到ThreadDestroyed回调......但我认为你得不到ThreadDestroyed回调的可能性更大的原因是IIS(我认为是由'页面加载'你指的是asp.net页面)决定将线程保留作为优化的未来请求,如果它认为它有足够的其他线程,它可能会决定终止它。

此外,关于您对该问题的第二个评论,ThreadID和ManagedThreadID之间没有关系。我相信ThreadID是对内部数据结构的引用(将其视为不透明值,不要试图解释它),并且ManagedThreadID看起来是一个简单的数字,因为线程首先输入托管代码。如果你想找出哪些线程ID对应与托管线程,我能想到的3个选项:如果线程名线程启动前设置了,那么这将:

  • 使用ThreadNameChanged回调(注意检查线程名在ThreadCreated回调前提出)
  • 使用ThreadAssignedToOSThread回调
  • 有异形代码调用到分析器为它提供上下文(使用的PInvoke或检查OS线程ID通过调用被仪器用于此目的的方法)