Question

J'ai un dump d'un processus .Net bloqué en raison d'un blocage (le thread d'interface graphique ne répond plus et mes journaux indiquent que certains threads ont cessé de répondre). J'ai pris un instantané et je regarde maintenant à travers celui-ci dans windbg, et tous les fils sauf l'un attendent le dernier. En regardant le stacktrace de ce fil avec! Clrstack -p, je constate qu'il tente d'obtenir une écriture sur un ReaderWriterLock

Comment puis-je savoir quel autre thread détient ce verrou afin de pouvoir comprendre comment le blocage s'est produit?

merci

[modifier] apparemment, il existait une commande! rwlocks dans le fichier .Net1.1 sos.dll pour résoudre ce problème, mais elle n’existe pas dans la version .Net2.0. La chasse continue

Était-ce utile?

La solution 4

Jusqu'à présent, la meilleure approche consiste à examiner le! dso de toutes les piles de threads et à voir celles qui font référence au verrou. Une vérification rapide après cela nous permet de localiser les threads qui contiennent des verrous. Vraiment pas une façon jolie ou rapide si ...

Autres conseils

Je ne suis pas absolument sûr, mais vous pourrez peut-être utiliser! SyncBlk pour examiner les objets de bloc de synchronisation, si vous l'appelez sans aucun argument, vous devriez voir les blocs de synchronisation appartenant à un thread.

Si vous avez un blocage de synchronisation, l'extension SOSEX pourrait être ce dont vous avez besoin. Cette extension offre la commande! Dlk qui indique quels threads attendent quels verrous. Cela ne fonctionne que pour les blocs de synchronisation, cependant, les blocages sur d'autres objets de synchronisation ne seront pas détectés. Si vous utilisez lock () (Monitor.Enter), cela ne devrait pas poser de problème.

Essayez sosex et! dlk

.

J'ai posté un sujet similaire il y a quelque temps, Il est possible de vérifier si un fichier est verrouillé sur un fichier >

J'ai référencé un certain nombre d'articles et autres, mais wait chain traversial (WCT) peut vous aider, c'est un peu délicat, mais ce magazine msdn bugslayer Cet article montre comment utiliser WCT dans windbg dans un contexte géré.

Une approche permettant d'assurer la traçabilité consiste à envelopper vos serrures dans une interface identifiable et à les remplacer:

lock (mylock) {...}

avec

using (new DisposeableLock ()) {...}

Vous pouvez connecter le constructeur et les méthodes Dispose () à la console, à log4net ou à un autre mécanisme. Cela vous permettra de voir ce qui est verrouillé et ce qui bloque quoi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top