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

标签 .net multithreading windbg

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

运行 !threads 命令显示我有:

ThreadCount: 456
UnstartedThread: 0
BackgroundThread: 6
PendingThread: 0
DeadThread: 449
Hosted Runtime: no

这是 !threads 输出的前几行:

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(线程池 worker )
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 0042a9f0 0 Ukn
XXXX f 0 0f082a38 9820 启用 00000000:00000000 0042a9f0 0 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 0042a9f0 0 MTA(线程池 worker )
XXXX 13 0 0570d620 9820 启用 00000000:00000000 0042a9f0 0 Ukn
XXXX 14 0 0570da08 9820 启用 00000000:00000000 0042a9f0 0 Ukn
XXXX 15 0 0570ddf0 9820 启用 00000000:00000000 0042a9f0 0 Ukn
XXXX 16 0 0570e1d8 9820 启用 00000000:00000000 0042a9f0 0 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 0042a9f0 0 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 0042a9f0 0 Ukn
XXXX 20 0 057a0480 9820 启用 00000000:00000000 0042a9f0 0 Ukn

如果我将 Visual Studio Debugger 附加到正在运行的进程,则“线程”窗口将显示 7 个线程。

我有几个问题:
  • 为什么 WinDbg 说有 456 个线程而任务管理器说 16 个
  • 为什么任务管理器说有 16 个线程而 Visual Studio Debugger 说有 7 个
  • !thread 命令显示所有这些死线程都没有 OSID 值。这是否意味着操作系统不再知道它们,而只是布局周围的 .Net 对象?死线程究竟是什么?
  • 我应该担心大量死线程吗?

  • 2010 年 2 月 11 日编辑: 以下是有关我的应用程序的更多信息。我们使用后台线程轮询服务器并执行其他任务。这些任务每隔几分钟执行一次。我们不使用 .Net 线程池。

    2010 年 2 月 18 日编辑: 我修复了我们程序中的托管线程对象泄漏(感谢@highphilosopher)。但是,我关于为什么 WinDbg、任务管理器和 VS 调试器不同意线程数的问题仍然没有答案。谁能解释一下?

    2010 年 3 月 1 日编辑: 我仍然很想知道为什么任务管理器和 Visual Studio 调试器不同意线程数。为什么 Visual Studio 会过滤一些线程?它过滤掉什么样的线程?

    最佳答案

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

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

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

    关于.net - 为什么WinDbg、任务管理器和VS Debugger 报告的线程数不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2240918/

    相关文章:

    c# - 这是使用泛型处理数据库中空值读取的安全有效方法吗?

    JAVAFX媒体: Serious optimization problem

    com - 如何在 WinDbg 中查看 VB6 控件级变量?

    c# - WinDbg .foreach 通过引用类型获取字段值

    c# - .NET 和 P2P - 编写 P2P 信使

    .net - 在 .Net 中替代手动构建表/TR/TD?

    c - 不使用互斥锁保护双变量

    windows - NTSD 和 WinDbg 之间到底有什么区别?

    .net - 将 wcf 服务托管到网站问题 : System. ArgumentException:ServiceHost 仅支持类服务类型

    java - 跨所有方法评估一个线程的性能