Анализ вывода! пул потоков и! потоки в windbg

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

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()
13
задан JohnW 9 January 2010 в 17:18
поделиться

1 ответ

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

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

!dumpheap -type TimerCallback

Затем сбросьте свойства обратного вызова (где адресом обратного вызова является "Адрес" из вывода дампы):

!do <callback address>

Затем сбросьте адрес Value свойства _target:

!do <_target address>

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

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

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

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

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

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

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

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

16
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: