Domanda

Ho un dump di un processo .Net che si è bloccato a causa di un deadlock (il thread della GUI non risponde più e i miei log mostrano che alcuni thread hanno smesso di rispondere). Ho scattato un'istantanea e ora la sto guardando in windbg, e tutti i thread tranne uno sono in attesa dell'ultimo. Osservando lo stacktrace di quel thread con! Clrstack -p vedo che sta cercando di acquisire una scrittura su ReaderWriterLock

Come faccio a sapere quale altro thread detiene quel blocco in modo da poter iniziare a capire come è avvenuto il deadlock?

grazie

[modifica] apparentemente c'era un comando! rwlocks in .Net1.1 sos.dll per aiutare con questo, ma non è presente nella versione .Net2.0. La caccia continua

È stato utile?

Soluzione 4

Finora l'approccio migliore è guardare! dso per tutte le pile di thread e vedere quali fanno riferimento al blocco. Un rapido controllo dopo ciò ci spinge a rintracciare quali thread mantengono i blocchi. In realtà non è un modo carino o veloce però ...

Altri suggerimenti

Non ne sono assolutamente sicuro, ma potresti essere in grado di usare! SyncBlk per esaminare gli oggetti del blocco di sincronizzazione, se lo invochi senza argomenti, penso che dovresti vedere i blocchi di sincronizzazione che sono di proprietà di un thread.

Se si dispone di un deadlock del blocco di sincronizzazione, l'estensione SOSEX potrebbe essere ciò di cui hai bisogno. Questa estensione offre il comando! Dlk che mostra quali thread sono in attesa di quali blocchi. Questo funziona solo per i blocchi di sincronizzazione, tuttavia i deadlock su altri oggetti di sincronizzazione non verranno rilevati, se stai usando lock () (Monitor.Enter) questo non dovrebbe essere un problema per te.

Prova sosex e! dlk

Ho pubblicato un argomento simile qualche tempo fa qui, L'utilizzo di C # è possibile verificare se un blocco viene mantenuto su un file

Ho fatto riferimento a un numero di articoli e simili, ma aspettare che l'attraversamento a catena (WCT) possa aiutarti, è un po 'permaloso ma questo msdn mag bugslayer l'articolo mostra come usare WCT in windbg in un contesto gestito.

Un approccio che fornirebbe tracciabilità è quello di avvolgere i blocchi in un'interfaccia IDisposable e sostituire:

lock (mylock) {...}

con

utilizzando (new DisposeableLock ()) {...}

È possibile registrare i metodi di costruzione e Dispose () sulla console, su log4net o su qualche altro meccanismo. Questo ti permetterà di vedere cosa sta bloccando e cosa sta bloccando su cosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top