J'essaye de dépanner une application COM + qui se bloque par intermittence. La dernière fois qu'il a été verrouillé, j'ai été capable de prendre un vidage usermode du processus dllhost et de l'analyser en utilisant WinDbg. Après avoir inspecté tous les fils et les serrures, tout cela se résume à une section critique appartenant à ce fil:Dépannage d'un blocage d'application COM +
ChildEBP RetAddr Args to Child
0deefd00 7c822114 77e6bb08 000004d4 00000000 ntdll!KiFastSystemCallRet
0deefd04 77e6bb08 000004d4 00000000 0deefd48 ntdll!ZwWaitForSingleObject+0xc
0deefd74 77e6ba72 000004d4 00002710 00000000 kernel32!WaitForSingleObjectEx+0xac
0deefd88 75bb22b9 000004d4 00002710 00000000 kernel32!WaitForSingleObject+0x12
0deeffb8 77e660b9 000a5cc0 00000000 00000000 comsvcs!PingThread+0xf6
0deeffec 00000000 75bb21f1 000a5cc0 00000000 kernel32!BaseThreadStart+0x34
L'objet qu'il est en attente sur est un événement:
0:016> !handle 4d4 f
Handle 000004d4
Type Event
Attributes 0
GrantedAccess 0x1f0003:
Delete,ReadControl,WriteDac,WriteOwner,Synch
QueryState,ModifyState
HandleCount 2
PointerCount 4
Name <none>
No object specific information available
Pour autant que je peux dire , l'événement n'est jamais signalé, provoquant le blocage du thread et bloquant plusieurs autres threads dans le processus. Quelqu'un at-il des suggestions pour les prochaines étapes pour déterminer ce qui se passe? Maintenant, vu que la méthode est appelée PingThread, est-il possible qu'elle essaye de faire un ping sur un autre thread dans le processus qui est déjà dans l'impasse?
MISE À JOUR
Cela en fait avéré être un bogue dans le client Oracle 10.2.0.1. Bien que, je suis toujours intéressé par des idées sur comment j'aurais pu comprendre cela sans trouver le bogue dans la base de données de bogues d'Oracle.