2010-03-03 15 views
3

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.

Répondre

0

SIEExtPub peut vous aider à comprendre les verrous COM

Et voici article sur ce

Si vous avez des difficultés à utiliser cette extension s'il vous plaît republier

0

Vous pouvez utiliser !locks qui essayera pour analyser automatiquement les interblocages, puis vider les piles d'appels des threads ~* kb et vérifier quels threads attendent sur la section critique ou les objets d'événement.

Il y a un exemple d'utilisation ici: http://www.dumpanalysis.org/blog/index.php/2007/07/28/crash-dump-analysis-patterns-part-9c/

ainsi que le site du gars a beaucoup d'exemples d'utilisation WinDbg pour d'autres types de blocages, y compris le code managé: http://www.dumpanalysis.org/ juste faire une recherche sur la page pour « impasse », espoir CA aide.