【问题标题】:Analyzing output of !threadpool and !threads in windbg在 windbg 中分析 !threadpool 和 !threads 的输出
【发布时间】:2011-01-03 07:11:56
【问题描述】:

我已经在四台服务器上生成了转储,并且正在分析 !threadpool 和 !threads 的输出。我注意到大致一致的以下输出:

0:024> !threadpool
CPU utilization 0%
Worker Thread: Total: 2 Running: 0 Idle: 2 MaxLimit: 200 MinLimit: 2
Work Request in Queue: 0
Number of Timers: 27
Completion Port Thread:Total: 2 Free: 0 MaxFree: 4 CurrentLimit: 2 MaxLimit: 200 MinLimit: 2

!threads -special ThreadCount: 32 UnstartedThread: 0 BackgroundThread: 19 PendingThread: 0 DeadThread: 13 Hosted Runtime: no

我的问题是:
1)如何确定这 27 个定时器的来源是什么?
2)13个死线程是什么意思?
3)我的一个线程被标记为有锁。如果我切换到该线程并运行!clrstack,我会看到以下内容 - 它与我的计时器有关吗?


0:027> !clrstack
OS Thread Id: 0x14cc (27)
*** WARNING: Unable to verify checksum for System.ni.dll
Child-SP         RetAddr          Call Site
000000000ca6e1a0 000007fef5c06477 System.Threading.WaitHandle.WaitAny(System.Threading.WaitHandle[], Int32, Boolean)
000000000ca6e200 000007fef673175b System.Net.TimerThread.ThreadProc()
000000000ca6e2d0 000007fef67c95fd System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
000000000ca6e320 000007fef84d1552 System.Threading.ThreadHelper.ThreadStart()

【问题讨论】:

    标签: multithreading windbg threadpool


    【解决方案1】:

    1)如何确定这27个定时器的来源是什么?

    尝试查找TimerCallback 的实例(用于Threading.Timer):

    !dumpheap -type TimerCallback
    

    然后转储回调属性(其中回调地址是转储堆输出中的“地址”):

    !do <callback address>
    

    然后转储_target属性的Value地址:

    !do <_target address>
    

    这应该会输出包含对 TimerCallback 的引用的对象,这应该会引导您到创建计时器的位置。

    如果您还没有,我建议您查看Tess Ferrandez's debugging labs

    2)13个死线程是什么意思?

    我的理解是,一个死线程是指一个 C++ 线程,它不再有一个活动的 OS 线程,但仍然有引用,因此不能被销毁(C++ 线程使用引用计数)。

    C# 线程包含对 C++ 线程的引用,如果您的托管代码保留对 C# 线程的引用,那么这可能是您的问题。

    This post on Yun Jin's blog 可能会引起您的兴趣。

    3) 我的一个线程被标记为有锁。如果我切换到该线程并运行!clrstack,我会看到以下内容 - 它与我的计时器有关吗?

    这看起来像是一个 (System.Threading) 计时器线程在等待其间隔结束。

    【讨论】:

    • 1) 谢谢。令人惊讶的是,当我做一个转储堆时,我得到了 80 个实例。这些值对我们拥有的应用程序有意义,但我希望有办法将这些值与 !threadpool 列出的 27 个相关联。 2)感谢您的博客链接。看起来很相关。
    • 是否有关于如何在 CLR 4 中调试 DeadThreads 的更新帖子?上面引用的 Yun Jin 的博客文章适用于 mscor 2(我认为)并且在 CLR 4 中不起作用,因为 CLR 4 中不存在符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多