.net 为什么WinDbg、任务管理器和VS调试器报告的线程数不同?

.net 为什么WinDbg、任务管理器和VS调试器报告的线程数不同?,.net,multithreading,windbg,.net,Multithreading,Windbg,当我的.Net 3.5应用程序运行时,Windows任务管理器显示我的应用程序有16个线程。我为进程收集了一个内存转储,并使用WinDbg/SOS打开了它 跑步!threads命令显示我有: ThreadCount: 456 UnstartedThread: 0 BackgroundThread: 6 PendingThread: 0 DeadThread: 449 Hosted Runtime: no 下面是本书的前几行!线程输出: ID OSID ThreadOBJ State

当我的.Net 3.5应用程序运行时,Windows任务管理器显示我的应用程序有16个线程。我为进程收集了一个内存转储,并使用WinDbg/SOS打开了它

跑步!threads命令显示我有:

ThreadCount: 456
UnstartedThread: 0
BackgroundThread: 6
PendingThread: 0
DeadThread: 449
Hosted Runtime: no
下面是本书的前几行!线程输出:

ID OSID ThreadOBJ State GC Context Domain Count APT Exception 0 1 2848 004366a8 6020 Enabled 11738178:11738778 0042a9f0 0 STA 2 2 1820 004430e0 b220 Enabled 00000000:00000000 0042a9f0 0 MTA (Finalizer) 7 5 2c38 055d6330 80a220 Enabled 00000000:00000000 0042a9f0 0 MTA (Threadpool Completion Port) 8 4 e18 04116900 180b220 Enabled 1157cdc8:1157e778 0042a9f0 0 MTA (Threadpool Worker) XXXX 6 0 055f94b0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 7 0 05649228 9820 Enabled 00000000:00000000 0042a9f0 0 MTA XXXX 8 0 0567d4f8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 9 0 05688d68 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX a 0 056fd680 9820 Enabled 00000000:00000000 0042a9f0 0 MTA XXXX b 0 0575d7f0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX c 0 056fd250 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX d 0 0572a780 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX e 0 0f082668 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX f 0 0f082a38 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 10 0 0570ca68 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 11 0 0570ce50 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn 10 12 3fb0 0570d238 180b220 Enabled 00000000:00000000 0042a9f0 0 MTA (Threadpool Worker) XXXX 13 0 0570d620 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 14 0 0570da08 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 15 0 0570ddf0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 16 0 0570e1d8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 17 0 0570e5c0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 18 0 0579e540 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 19 0 0579e928 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1a 0 0579ed10 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1b 0 0579f0f8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1c 0 0579f4e0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1d 0 0579f8c8 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1e 0 0579fcb0 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 1f 0 057a0098 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn XXXX 20 0 057a0480 9820 Enabled 00000000:00000000 0042a9f0 0 Ukn ID OSID ThreadOBJ状态GC上下文域计数APT异常 0 1 2848 004366a8 6020已启用11738178:11738778 0042a9f0 0 STA 2 2 1820 004430e0 b220启用00000000:00000000 0042a9f0 0 MTA(终结器) 7 5 2c38 055d6330 80a220已启用00000000:00000000 0042a9f0 0 MTA(线程池完成端口) 8 4 e18 04116900 180b220已启用1157cdc8:1157e778 0042a9f0 0 MTA(线程池工作线程) XXXX 6 0 055f94b0 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 7 0 05649228 9820已启用00000000:00000000 0042a9f0 0 MTA XXXX 8 0 0567d4f8 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 9 0 05688d68 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX a 0 056fd680 9820启用00000000:00000000 0042a9f0 0 MTA XXXX b 0 0575d7f0 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX c 0 056fd250 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX d 0 0572a780 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX e 0 0f082668 9820已启用00000000:00000000 0042A9F00 Ukn XXXX f 0 0f082a38 9820已启用00000000:00000000 0042A9F00 Ukn XXXX 10 0 0570ca68 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 11 0 0570ce50 9820已启用00000000:00000000 0042a9f0 0 Ukn 10 12 3fb0 0570d238 180b220已启用00000000:00000000 0042A9F00 MTA(线程池工作线程) XXXX 13 0 0570d620 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 14 0 0570da08 9820已启用00000000:00000000 0042A9F00 Ukn XXXX 15 0 0570ddf0 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 16 0 0570e1d8 9820已启用00000000:00000000 0042A9F00 Ukn XXXX 17 0 0570e5c0 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 18 0 0579e540 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 19 0 0579e928 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 1a 0 0579ed10 9820已启用00000000:00000000 0042A9F00 Ukn XXXX 1b 0 0579f0f8 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 1c 0 0579f4e0 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 1d 0 0579f8c8 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 1e 0 0579fcb0 9820已启用00000000:00000000 0042a9f0 0 Ukn XXXX 1f 0 057a0098 9820启用00000000:00000000 0042A9F00 Ukn XXXX 20 0 057a0480 9820启用00000000:00000000 0042a9f0 0 Ukn 如果将VisualStudio调试器附加到正在运行的进程,线程窗口将显示7个线程

我有几个问题:

  • 为什么WinDbg说有456个线程,而TaskManager说有16个
  • 为什么任务管理器说有16个线程,而VisualStudio调试器说有7个线程
  • 这个!thread命令显示所有这些死线程都没有OSID值。这是否意味着操作系统不再知道它们,而只是周围布局的.Net对象?什么是死线
  • 我应该担心大量的死线程吗
编辑2010年2月11日:以下是有关我的应用程序的更多信息。我们使用后台线程轮询服务器并执行其他任务。这些任务每隔几分钟执行一次。我们不使用.Net线程池

编辑2010年2月18日:我修复了程序中的托管线程对象泄漏(感谢@HighSpherector)。然而,关于为什么WinDbg、任务管理器和VS调试器在线程数量上不一致,我的问题仍然没有答案。有人能解释一下吗


编辑2010年3月1日:我仍然有兴趣知道为什么任务管理器和Visual Studio调试器在线程数量上不一致。为什么VisualStudio会过滤一些线程?它过滤出什么类型的线程?

我猜线程池有一段时间负载很重,然后在负载减少时终止线程。

您看到的内容听起来像是在不同线程上引用了这些线程。由于线程被引用,GC无法收集它。线程已经完成了发送给它的方法的执行,因此它既不是处于睡眠状态,也不是处于可运行状态,因此它必须是死的。检查代码中的线程集合或类似内容。可能是某个事件被线程钩住,但从未解除钩住?

任务管理器报告进程的线程总数,而
!threads
报告托管线程的数量。如果在WinDbg中使用
~
命令,您将看到该进程的所有线程

的输出!输出中的threads
显示了大量死线程。id为XXXX的
XXXX
列出的线程是已终止但尚未收集相应线程对象的线程。即,报告的线程数远高于实际线程数。线程计数表示456个线程中有449个是死线程


我发现线程的数量很高,如果应用程序一直处于空闲状态,那么线程仍然存在是很奇怪的,但是如果没有进一步的信息,就很难更加具体

线程计数不匹配的另一个原因是任务管理器使用非侵入性技术收集信息。调试器通常,默认情况下使用侵入式附加

这意味着,任何时候