2009-06-10 20 views
5

Notre application Windows est souvent suspendue en mémoire et je suis en train d'utiliser windbg pour suivre le problème. Je suis très nouveau à windbg et pourrait utiliser quelques conseils (j'ai ont commencé à lire Advanced Windows Debugging si).Diagnostiquer une application qui ne parvient pas à arrêter

L'application est un mélange de C++ et des objets COM écrit en VB. De temps en temps lorsque vous quittez , l'application semble aller, mais le gestionnaire de tâches montre qu'il traîner en mémoire, apparemment ralenti. !

fils me montre ceci:

ThreadCount: 2 
UnstartedThread: 0 
BackgroundThread: 2 
PendingThread: 0 
DeadThread: 0 
Hosted Runtime: no 
             PreEmptive GC Alloc   Lock 
     ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
    0 1 175c 001aa040  4220 Enabled 09131b78:09131fe8 001a2b80  0 STA 
    6 2 143c 001b4b48  b220 Enabled 00000000:00000000 001a2b80  0 MTA (Finalizer) 

A mon œil non averti, on dirait qu'il est maintenu en vie par la file d'attente finalize bloquée par un seul thread. Est-ce que ce semble raisonnable?

~ rendements 0KB:

ntdll!KiFastSystemCallRet 
user32!NtUserGetMessage+0xc 
mfc80!AfxInternalPumpMessage+0x18 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 153] 
mfc80!CWinThread::Run+0x54 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 625] 
mfc80!AfxWinMain+0x69 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp @ 47] 
WARNING: Stack unwind information not available. Following frames may be wrong. 
OurApp+0x7e8274 
kernel32!BaseProcessStart+0x23 

~ rendements 6Ko:

ntdll!KiFastSystemCallRet 
ntdll!ZwWaitForMultipleObjects+0xc 
kernel32!WaitForMultipleObjectsEx+0x12c 
kernel32!WaitForMultipleObjects+0x18 
mscorwks!WKS::WaitForFinalizerEvent+0x7a 
mscorwks!WKS::GCHeap::FinalizerThreadWorker+0x75 
mscorwks!Thread::UserResumeThread+0xfb 
mscorwks!Thread::DoADCallBack+0x355 
mscorwks!Thread::DoADCallBack+0x541 
mscorwks!ManagedThreadBase_NoADTransition+0x32 
mscorwks!ManagedThreadBase::FinalizerBase+0xb 
mscorwks!WKS::GCHeap::FinalizerThreadStart+0xbb 
mscorwks!Thread::intermediateThreadProc+0x49 
kernel32!BaseThreadStart+0x37 

J'apprécieraient une correction peu de cours ici. Si ma supposition d'un finaliseur bloqué semble raisonnable, s'il vous plaît faites le moi savoir. Je serais également très heureux d'obtenir des conseils pour savoir ce qui bloque exactement.

Edit:

Shane a demandé pour la sortie d'analyser!. C'est en fait d'une décharge différente - j'ai beaucoup d'entre eux et ils ressemblent tous à peu près la même chose.

 
FAULTING_IP: 
+18a952f00ebdf74 
00000000 ??    ??? 

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) 
ExceptionAddress: 00000000 
    ExceptionCode: 80000007 (Wake debugger) 
    ExceptionFlags: 00000000 
NumberParameters: 0 

BUGCHECK_STR: 80000007 

PROCESS_NAME: OurApp.exe 

OVERLAPPED_MODULE: Address regions for 'OurApp' and 'Unknown_Module_00350062' overlap 

ERROR_CODE: (NTSTATUS) 0x80000007 - {Kernel Debugger Awakened} the system debugger was awakened by an interrupt. 

EXCEPTION_CODE: (HRESULT) 0x80000007 (2147483655) - Operation aborted 

NTGLOBALFLAG: 0 

APPLICATION_VERIFIER_FLAGS: 0 

MANAGED_STACK: !dumpstack -EE 
OS Thread Id: 0x4490 (0) 
Current frame: 
ChildEBP RetAddr Caller,Callee 

DERIVED_WAIT_CHAIN: 

Dl Eid Cid  WaitType 
-- --- ------- -------------------------- 
    0 48c8.4490 Speculated (Triage) --> 
    5 48c8.4b74 Event     

WAIT_CHAIN_COMMAND: ~0s;k;;~5s;k;; 

BLOCKING_THREAD: 00004b74 

DEFAULT_BUCKET_ID: APPLICATION_HANG_BlockedOn_EventHandle 

PRIMARY_PROBLEM_CLASS: APPLICATION_HANG_BlockedOn_EventHandle 

LAST_CONTROL_TRANSFER: from 7c90df4a to 7c90e514 

FAULTING_THREAD: 00000005 

STACK_TEXT: 
0882fcd0 7c90df4a 7c809590 00000002 0882fcfc ntdll!KiFastSystemCallRet 
0882fcd4 7c809590 00000002 0882fcfc 00000001 ntdll!ZwWaitForMultipleObjects+0xc 
0882fd70 7c80a115 00000002 7a3b8d28 00000000 kernel32!WaitForMultipleObjectsEx+0x12c 
0882fd8c 79f92c5b 00000002 7a3b8d28 00000000 kernel32!WaitForMultipleObjects+0x18 
0882fdac 79f970b8 001b1ad8 0882feb0 001a0b18 mscorwks!WKS::WaitForFinalizerEvent+0x77 
0882fdc0 79e984cf 0882feb0 00000000 00000000 mscorwks!WKS::GCHeap::FinalizerThreadWorker+0x49 
0882fdd4 79e9846b 0882feb0 0882fe5c 79f7762b mscorwks!Thread::DoADCallBack+0x32a 
0882fe68 79e98391 0882feb0 9f3f02e2 00000000 mscorwks!Thread::ShouldChangeAbortToUnload+0xe3 
0882fea4 79eef74c 0882feb0 00000000 001a86c0 mscorwks!Thread::ShouldChangeAbortToUnload+0x30a 
0882fecc 79eef75d 79f9706d 00000008 0882ff14 mscorwks!ManagedThreadBase_NoADTransition+0x32 
0882fedc 79f3c6bc 79f9706d 9f3f0352 00000000 mscorwks!ManagedThreadBase::FinalizerBase+0xd 
0882ff14 79f920a5 00000000 86fb6620 804fb078 mscorwks!WKS::GCHeap::FinalizerThreadStart+0xbb 
0882ffb4 7c80b729 001a0b18 00730074 00610020 mscorwks!Thread::intermediateThreadProc+0x49 
0882ffec 00000000 79f9205f 001a0b18 00000000 kernel32!BaseThreadStart+0x37 


FOLLOWUP_IP: 
mscorwks!WKS::WaitForFinalizerEvent+77 
79f92c5b 85c0   test eax,eax 

SYMBOL_STACK_INDEX: 4 

SYMBOL_NAME: mscorwks!WKS::WaitForFinalizerEvent+77 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: mscorwks 

IMAGE_NAME: mscorwks.dll 

DEBUG_FLR_IMAGE_TIMESTAMP: 492b82c1 

STACK_COMMAND: ~5s ; kb 

BUCKET_ID: 80000007_mscorwks!WKS::WaitForFinalizerEvent+77 

FAILURE_BUCKET_ID: APPLICATION_HANG_BlockedOn_EventHandle_80000007_mscorwks.dll!WKS::WaitForFinalizerEvent 

WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/OurApp_exe/6_2_6_1/4a29a184/unknown/0_0_0_0/bbbbbbb4/80000007/00000000.htm?Retriage=1 

Followup: MachineOwner 
--------- 

0:000> !threads 
ThreadCount: 2 
UnstartedThread: 0 
BackgroundThread: 2 
PendingThread: 0 
DeadThread: 0 
Hosted Runtime: no 
             PreEmptive GC Alloc   Lock 
     ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
    0 1 4490 0019de20  4220 Enabled 09003658:09003fe8 001a86c0  0 STA 
    5 2 4b74 001b1b08  b220 Enabled 00000000:00000000 001a86c0  0 MTA (Finalizer) 
+0

Êtes-vous sûr sont correctement libérés tous les objets créés? Le moyen le plus simple de vous assurer est d'utiliser certaines des différentes classes auto ptr. Si vous n'avez pas fait cela, vous devriez. – eran

+0

Je pense que ce blocage est le résultat d'un objet COM qui a fui. Il semble se rencontrer qu'il devrait y avoir un moyen de localiser l'objet avec windbg. Aucun conseil? En outre, je suis un grand, grand croyant dans les pointeurs intelligents et d'éviter les pointeurs nus dès que je peux. – criddell

Répondre

3

Le thread du finaliseur est inactif et attend le travail: sa trace semble correcte. Theread 0 a également l'air bien et est inactif - il attend le prochain message d'interface utilisateur.

Pouvez-vous donner quelques détails sur la façon dont vous la « sortie » de l'application? Étant donné que la boucle de message est toujours en cours d'exécution, il me semble que quelque chose ne va pas avec votre logique d'application proche.

+0

C'est une application Windows MFC. Cela fait un moment que je me suis plongé dans le code, mais je crois que l'application se termine en affichant un message SC_CLOSE ou WM_QUIT. Je suppose qu'il est verrouillé car il y a encore un objet OLE en mémoire et AfxOleCanExitApp() retourne false car le nombre d'objet est> 0. Je pense que si je pouvais mieux travailler windbg, je pourrais localiser les objets qui ont fui. – criddell

2

Je suis d'accord avec J. Passing.

Étant donné qu'un thread est du code managé, avez-vous essayé de charger l'extension de débogage SOS dans windbg pour obtenir la trace de la pile gérée. Aussi, vous pouvez essayer la commande "!analyze -v" de windbg et voir ce que cela dit.

+0

Shane, j'ai collé la sortie de la commande d'analyse ci-dessus. Merci d'avoir regarder ceci. – criddell

+0

Cela confirme à peu près ce que disait l'autre poste.Pouvez-vous également publier la sortie de '! Clrstack' après avoir chargé l'extension sos. Cela peut aider un peu. Consultez aussi http://blogs.msdn.com/tess/archive/2007/12/12/automated-net-hang-analysis.aspx –