Pergunta

Eu tenho um despejo de um processo Net que tem devido pendurado a um impasse (o fio gui não está mais respondendo, e os meus registros mostram que alguns tópicos ter parado de responder). Tomei um instantâneo e agora estou procurando por ele no WinDbg, e os tópicos bar one estão esperando o último. Olhando para stacktrace que um thread com! Clrstack -p eu posso ver que ele está tentando adquirir uma gravação em um ReaderWriterLock

Como posso saber qual outro segmento sustenta que bloqueio para que eu possa começar a descobrir como o impasse aconteceu?

graças

[editar] aparentemente, houve um comando! Rwlocks no sos.dll .Net1.1 para ajudar com isso, mas não é lá na versão .Net2.0. A caçada continua

Foi útil?

Solução 4

Até agora, a melhor abordagem é olhar para o dso! Para todas as pilhas de thread, e ver qual deles faz referência a fechadura. Uma verificação rápida após o que tem alles-nos para rastrear quais tópicos manter bloqueios. Realmente não é uma maneira muito ou rápido embora ...

Outras dicas

Eu não estou absolutamente certo, mas você pode ser capaz de usar! SyncBlk de olhar para os objetos de bloco de sincronismo, se você chamá-lo sem nenhum argumento que eu acho que você deve ver os blocos de sincronização que são possuídos por um fio.

Se você tem um impasse de blocos de sincronização, a extensão SOSEX pode ser o que você precisa. Esta extensão oferece o comando! Dlk que mostra quais tópicos estão à espera de que fechaduras. Isso só funciona para blocos de sincronização, porém, impasses em outros objetos de sincronização não serão detectados, se você estiver usando lock () (Monitor.Enter), este não deve ser um problema para você.

Tente sosex ! Dlk

Eu postei um simular tópico um tempo atrás aqui, Usando C # é possível testar se um bloqueio é realizada em um arquivo

Eu referência a um número de artigos e tal, mas traversial cadeia de espera (WCT) pode ajudá-lo, é um pouco delicado, mas este MSDN mag bugslayer artigo mostram como usar WCT em windbg em um contexto gerenciado.

Uma abordagem que iria fornecer rastreabilidade é envolver seus bloqueios em uma interface IDisposable e substituir:

Bloqueio (myLock) {...}

com

usando (novo DisposeableLock ()) {...}

Você pode registrar a métodos Dispose () construtor e tanto para o console, ou log4net, ou algum outro mecanismo. Isto irá permitir que você veja o que está sendo bloqueio eo que está bloqueando o.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top