Анализ вывода! Threadpool и! Thread в windbg

Я создал дампы на четырех серверах и анализирую вывод! Threadpool и! Thread. Я заметил примерно одинаковый следующий результат:

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()


person JohnW    schedule 09.01.2010    source источник


Ответы (1)


1) Как я могу определить источник этих 27 таймеров?

Попробуйте найти экземпляры TimerCallback (для Threading.Timer):

!dumpheap -type TimerCallback

Затем выгрузите свойства обратного вызова (где адрес обратного вызова - это «Адрес» из вывода dumpheap):

!do <callback address>

Затем выгрузите Value адрес свойства _target:

!do <_target address>

Это должно выплюнуть объект, содержащий ссылку на TimerCallback, который должен привести вас туда, где был создан таймер.

Я рекомендую ознакомиться с лабораториями отладки Тесс Феррандес, если вы еще этого не сделали.

2) Что значит 13 мертвых нитей?

Насколько я понимаю, мертвый поток относится к потоку C ++, который больше не имеет активного потока ОС, но все еще имеет ссылки и, следовательно, не может быть уничтожен (потоки C ++ используют подсчет ссылок).

Поток C # содержит ссылку на поток C ++, и если ваш управляемый код хранит ссылку на поток C #, то это может быть вашей проблемой.

Эта запись в блоге Юнь Джина может быть интересна тебе.

3) Одна из моих тем помечена как заблокированная. Если я переключусь на этот поток и запущу! Clrstack, я увижу следующее - связано ли это с моими таймерами?

Это похоже на поток таймера (System.Threading), ожидающий истечения своего интервала.

person Richard Szalay    schedule 12.01.2010
comment
1) Спасибо. Удивительно, но мне предоставили 80 экземпляров, когда я делал помойку. Значения имеют смысл для нашего приложения, но мне нужен способ соотнести их с 27, перечисленными! Threadpool. 2) Спасибо за ссылку на блог. Выглядит актуально. - person JohnW; 12.01.2010