我已经在四台服务器上生成了转储,并正在分析 !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
!线程-特殊
线程数:32
未启动线程: 0
背景主题: 19
待处理线程:0
死线程:13
托管运行时:无
1)如何确定这27个定时器的来源是什么?
尝试寻找以下实例TimerCallback
(对于线程.定时器):
!dumpheap -type TimerCallback
然后转储回调属性(其中回调地址是转储堆输出中的“地址”):
!do <callback address>
然后转储Value
地址的_target
财产:
!do <_target address>
这应该会吐出包含对 TimerCallback 的引用的对象,这应该会引导您到创建计时器的位置。
我建议查看Tess Ferrandez 的调试实验室 http://blogs.msdn.com/tess/pages/net-debugging-demos-information-and-setup-instructions.aspx,如果你还没有的话。
2)13个死线程是什么意思?
我的理解是,死线程是指不再具有活动操作系统线程的 C++ 线程,但仍然具有引用,因此无法被销毁(C++ 线程使用引用计数)。
C# 线程保存对 C++ 线程的引用,如果您的托管代码保存对 C# 线程的引用,那么这可能是您的问题。
这篇文章发表在 Yun Jin 的博客上 http://blogs.msdn.com/yunjin/archive/2005/08/29/457150.aspx您可能会感兴趣。(回溯存档) http://web.archive.org/web/20090115214354/http://blogs.msdn.com/yunjin/archive/2005/08/29/457150.aspx
3)我的一个线程被标记为有锁。如果我切换到该线程并运行 !clrstack,我会看到以下内容 - 它与我的计时器有关吗?
这看起来像一个(System.Threading)计时器线程等待其时间间隔过去。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)