Syl*_*ain 15 .net multithreading windbg
当我的.Net 3.5应用程序运行时,Windows任务管理器显示我的应用程序有16个线程.我为进程收集了一个内存转储,并使用WinDbg/SOS打开它.
运行!threads命令显示我有:
ThreadCount: 456
UnstartedThread: 0
BackgroundThread: 6
PendingThread: 0
DeadThread: 449
Hosted Runtime: no
Run Code Online (Sandbox Code Playgroud)
以下是!threads输出的前几行:
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
如果我将Visual Studio Debugger附加到正在运行的进程,则Threads窗口将显示7个线程.
我有几个问题:
编辑2010年2月11日:这是有关我的应用程序的更多信息.我们使用后台线程来轮询服务器并执行其他任务.这些任务每隔几分钟执行一次.我们不使用.Net线程池.
编辑2010年2月18日:我在我们的程序中修复了托管的Thread对象泄漏(感谢@highphilosopher).但是,我的问题是WinDbg,任务管理器和VS调试器为什么不同意线程数仍然没有答案.谁能解释一下?
编辑2010年3月1日:我仍然有兴趣知道为什么任务管理器和Visual Studio调试器不同意线程数.为什么Visual Studio会过滤一些线程?过滤掉了什么样的线程?
Bri*_*sen 11
任务管理器报告进程的线程总数,同时!threads报告托管线程的数量.如果~在WinDbg中使用该命令,您将看到该进程的所有线程线程.
输出!threads中的输出显示了很多死线程.列出的带有XXXXfor id的线程是已终止但尚未收集相应线程对象的线程.即报告的数量远远高于实际的线程数.线程计数数字表明456个线程中有449个死亡.
我发现线程的数量很高,如果应用程序已经处于空闲状态,那么仍然很奇怪,但是如果没有进一步的信息则很难更具体.