Поток финализатора заблокирован

Я выполняю посмертный анализ приложения .net с высокой нагрузкой на память, используя WinDbg с дампом процесса, и этот процесс является службой Windows.

со следующим выводом кажется, что финализатор заблокирован.

Я просмотрел код, и, кажется, нет подозрительного метода финализации, который сдерживает поток. каковы общие шаблоны для поиска такого поведения?

Существуют ли какие-либо другие команды WinDBG, которые помогут мне провести дальнейшую диагностику?

Спасибо,

0:000> ~[2]к

Child-SP          RetAddr           Call Site
00000017`fd5bf2c8 00007ffc`d340dd29 ntdll!NtWaitForSingleObject+0xa
00000017`fd5bf2d0 00007ffc`d340b6f4 ntdll!RtlpWaitOnCriticalSection+0xe1
00000017`fd5bf3a0 00007ffc`ca95ec1b ntdll!RtlpEnterCriticalSectionContended+0xa4
00000017`fd5bf3e0 00007ffc`ca7a8180 clr!CrstBase::Enter+0x119
00000017`fd5bf410 00007ffc`ca9582cc clr!ThreadStore::LockThreadStore+0x68
00000017`fd5bf440 00007ffc`ca95829b clr!Thread::CleanupDetachedThreads+0x2c
00000017`fd5bf4a0 00007ffc`ca8a603b clr!Thread::DoExtraWorkForFinalizer+0x186
00000017`fd5bf4d0 00007ffc`ca960805 clr!WKS::GCHeap::FinalizerThreadWorker+0x10c
00000017`fd5bf510 00007ffc`ca96078c clr!ManagedThreadBase_DispatchInner+0x2d
00000017`fd5bf550 00007ffc`ca9606f5 clr!ManagedThreadBase_DispatchMiddle+0x6c
00000017`fd5bf650 00007ffc`ca8eb377 clr!ManagedThreadBase_DispatchOuter+0x75
00000017`fd5bf6e0 00007ffc`ca95e8b6 clr!WKS::GCHeap::FinalizerThreadStart+0xd7
00000017`fd5bf780 00007ffc`d0d713d2 clr!Thread::intermediateThreadProc+0x7d
00000017`fd5bf840 00007ffc`d33e5454 kernel32!BaseThreadInitThunk+0x22
00000017`fd5bf870 00000000`00000000 ntdll!RtlUserThreadStart+0x34

person sophia liu    schedule 21.03.2016    source источник
comment
Вы можете запустить analyze -v -hang и использовать вывод, чтобы переключиться на блокирующий поток и получить трассировку стека для этого потока ~<blockingthread>; kbnf. Если вы опубликуете вывод, вы наверняка получите новые указатели на то, куда идти дальше.   -  person Lieven Keersmaekers    schedule 21.03.2016


Ответы (1)


Поток Finalizer в этом конкретном дампе заблокирован, но это может быть нормально. Ведь замки вводятся постоянно. Чтобы определить, действительно ли у вас есть проблема, вам нужно посмотреть, сколько объектов находится в f-достижимой очереди. Вы можете сделать это с помощью !sos.finalizequeue или !sosex.frq.

Не забудьте также изучить вывод !sos.dumpheap, чтобы увидеть, не связана ли ваша проблема с утечкой памяти.

person Steve Johnson    schedule 22.03.2016