2016-03-21 22 views
2

Ich mache postmortem Analyse auf einem hohen Speicherdruck .net-Anwendung mit WinDbg mit einem Prozess-Dump und dieser Prozess ist ein Windows-Dienst.Finalizer-Thread wurde blockiert

mit der folgenden Ausgabe scheint es, dass der Finalizer blockiert ist.

Ich habe den Code durchsucht und es scheint keine verdächtige Finalize-Methode, die den Thread zurückhält. Was sind die üblichen Muster, um nach einem solchen Verhalten zu suchen?

Gibt es noch andere WinDBG-Befehle, die mir bei der weiteren Diagnose helfen?

Danke,

0: 000> ~ [2] k

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 
+2

Sie können 'analyze -v -hang' ausführen und die Ausgabe verwenden, um zum blockierenden Thread zu wechseln und einen StackTrace für diesen Thread zu erhalten' ~ ; kbnf'. Wenn Sie die Ausgabe veröffentlichen, werden Sie sicherlich neue Hinweise bekommen, wo Sie von dort aus weitergehen können. –

Antwort

0

Der Finalizerthread in diesem speziellen Dump blockiert ist, aber das in Ordnung sein kann. Schliesslich werden immer Schlösser eingegeben. Um festzustellen, ob Sie wirklich ein Problem haben, müssen Sie sehen, wie viele Objekte in der f-erreichbar-Warteschlange sind. Sie können dies mit! Sos.finalizequeue oder! Sosex.frq tun.

Stellen Sie sicher, dass Sie auch die Ausgabe von! Sos.dumpheap untersuchen, um zu sehen, ob Ihr Problem stattdessen ein Speicherleck ist.