调试I / O完成线程泄漏

时间:2013-01-08 15:55:41

标签: .net threadpool windbg

我正在尝试在.NET应用程序中找到可能的I / O完成线程泄漏。 我不时使用ThreadPool.GetAvailableThreads对可用的I / O完成线程数进行抽样。 在某些时候,可用线程的数量开始从1000减少到1(几分钟)。

一旦获得1个可用线程,我看不到任何内存泄漏,错误,执行延迟或类似内容。

在windbg中,当运行!线程时,我看到〜700个线程,其中没有来自线程池,大多数都标有XXXX(据我所知,这意味着GC还没有收集线程) , 例如: XXXX 2a4 1630 37d54610 1400启用00000000:00000000 004b70d8 0 Ukn(或MTA)

如何调试这个?我怎样才能看到完成线程的callstack?

运行!threadpool时,我得到以下内容:

  

CPU利用率:31%工作线程:总计:2047运行:2047空闲:0   MaxLimit:2047 MinLimit:队列中的2个工作请求:0   --------------------------------------计时器数量:4   --------------------------------------完成端口线程:总计:1000免费:1 MaxFree: 4 CurrentLimit:999 MaxLimit:1000 MinLimit:2

然而,

1 个答案:

答案 0 :(得分:2)

运行!sos.name2ee mscorlib.dll System.Threading.Thread并记下MethodTable。 然后运行!sos.dumpheap -mt [MT]。这将为您提供线程对象的列表。然后运行!sos.gcroot [THREADOBJ]看看他们持有什么。