2013-06-26 2 views
2

최근 서버 응용 프로그램 (Windows 서비스) 중 하나가 OutOfMemory 예외로 인해 실패했음을 발견했습니다. 우리는 무슨 일이 일어나고 있는지 알아 내려고 노력했는데, finalize되지 않은 finalize 큐의 객체로 끝나기 때문에 아무런 가비지 콜렉션도 발생하지 않았습니다. 우리는 Windbg를 사용하여이 동작을 일으킬 수있는 마무리자를 찾지 만 어떤 객체가 원인인지 정확히 알 수 없습니다. ! 우리가 이것을 알 수 finalizequeue 명령을 사용하여대기열 고정 완료

:

 

    0:053> !finalizequeue 
    PDB symbol for clr.dll not loaded 
    SyncBlocks to be cleaned up: 0 
    Free-Threaded Interfaces to be released: 0 
    MTA Interfaces to be released: 0 
    STA Interfaces to be released: 0 
    ---------------------------------- 
    generation 0 has 28 finalizable objects (050eab4c->050eabbc) 
    generation 1 has 15 finalizable objects (050eab10->050eab4c) 
    generation 2 has 658 finalizable objects (050ea0c8->050eab10) 
    Ready for finalization 3027 objects (050eabbc->050edb08) 
    ... 

3027 믿을 수 없을만큼 많은 수의 (그것이 실행의 몇 분의이 숫자는 여전히 성장하고 떨어되지 않습니다)입니다. 나는 어떤 객체가 주소 050eabbc에 있는지 알아 내려고 노력했지만 항상 다른 유형이므로 원인이 아니라고 생각합니다. 그래서이 종료 자 스레드가 붙어있다 또 다른 단서가

 

    0:053> ~2k 
    *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\KERNELBASE.dll - 
    ChildEBP RetAddr 
    WARNING: Stack unwind information not available. Following frames may be wrong. 
    032ef09c 772f10b4 ntdll!ZwWaitForSingleObject+0xc 
    *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\combase.dll - 
    032ef0b0 755ff0b5 KERNELBASE!WaitForSingleObject+0x12 
    032ef0e4 7554b22a combase!NdrOleDllGetClassObject+0x1399 
    032ef108 755ff10c combase!PropVariantCopy+0x177b 
    032ef224 75511724 combase!NdrOleDllGetClassObject+0x13f0 
    032ef27c 7558115d combase!DcomChannelSetHResult+0x17c7 
    032ef2d8 755fd39a combase!CoRegisterSurrogateEx+0x3494 
    *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\RPCRT4.dll - 
    032ef2f4 76a9e4a0 combase!NdrExtStubInitialize+0x21a9 
    032ef71c 755fc779 RPCRT4!NdrComplexArrayUnmarshall+0xcac 
    032ef738 75510d77 combase!NdrExtStubInitialize+0x1588 
    032ef748 755816d5 combase!DcomChannelSetHResult+0xe1a 
    032ef7dc 75587aa5 combase!CoRegisterSurrogateEx+0x3a0c 
    *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll - 
    032ef82c 748ab680 combase!StringFromIID+0x28d 
    032ef92c 748ab758 clr!PreBindAssemblyEx+0x259d 
    032ef964 7487960d clr!PreBindAssemblyEx+0x2675 
    032ef980 748ab55a clr!GetMetaDataInternalInterfaceFromPublic+0x2162a 
    032ef9dc 74878915 clr!PreBindAssemblyEx+0x2477 
    032efa2c 7487887c clr!GetMetaDataInternalInterfaceFromPublic+0x20932 
    032efa44 7478a5e2 clr!GetMetaDataInternalInterfaceFromPublic+0x20899 
    032efa8c 74777d71 clr!GetPrivateContextsPerfCounters+0x968 

종료 자 스레드가 항상 ZwWaitForSingleObject에 붙어 : 나는 종료 자 스레드의 기본 호출 스택을 인쇄하려고하면

, 나는 이것을 얻었다.

제 질문은 어떤 객체가 파이널 라이저 큐가 멈추는 지 어떻게 알 수 있습니까? 재미 있은 점은 finalizers를 전혀 사용하지 않는다는 것입니다 :-(

+2

당신의 스택 TRAC의 품질 e는 너무 가난합니다. 이러한 "심볼 파일을 찾을 수 없습니다"라는 메시지가 사라지도록 Microsoft Symbol 서버를 사용하도록 디버거를 설정해야합니다. –

+0

뭔가 finalizers를 사용하고 있습니다. 타사 라이브러리를 사용하고 있습니까? 그렇다면 나는 그것들에 대한 코드 리뷰를하기 시작할 것이다. finalizer에 예외가 발생하여 종료자가 가장 많이 충돌합니다. –

+0

STAThread 속성을 MTAThread 속성으로 전환하려고 시도했지만 다시 작동하기 시작했습니다! 왜 우리는 COM을 전혀 사용하지 않기 때문에 이유를 모르겠다. – user2523230

답변

4

내 "심령 디버깅"은 STA 스레드에서 실행되는 일부 코드는 COM 개체를 생성하지만 STA 스레드는 COM 규칙을 따르지 않는다고 추측합니다. (그리고 아마도 스레드가 모두 사라졌음). 파이널 라이저의 호출 스택에 대한 경고가 있기 때문에 나는 이것을 말하고 있습니다. 적절한 심볼이 필요하고 기본 및 관리 호출 스택을 모두보아야합니다.

당신이이 질문을 부활하려는 경우

.symfix C:\localsymbolcache .reload ~2s kb !clrstack

후 다시 결과.

+0

유사한 스택 정보가있는 유사한 사례 : http://stackoverflow.com/questions/41010449/determining-the-com-object-blocking-finalizer –