Ferramenta de análise C # / .NET para encontrar condições de corrida / deadlocks

Existe uma ferramenta que analisa o código .NET e encontra condições de corrida?

Eu tenho um pouco de código que tem uma propriedade estática pública que obtém ou cria um campo estático privado. Ele também tem um método estático público que define esse campo como null (… sim, eu sei! ..)

Como não há bloqueios em torno de qualquer um desses methods, é uma aposta segura que as coisas vão dar errado no futuro. Eu preciso de uma ferramenta que vai recursivamente passar por coisas que chamam qualquer um desses methods e ver se alguma coisa foi gerada em outro segmento.

Estou procurando uma ferramenta ou talvez um script nDepend SQL (se isso for possível).

Você provavelmente está procurando por um destes:

  • XADREZ
  • Typemock Racer

NOTA : Esta resposta é de 2010. Como acontece com todas as respostas das recomendações, as recomendações tendem a mudar com o tempo. Pode haver outros produtos disponíveis, o CHESS, que era um projeto do Microsoft Research Labs, pode ter evoluído para um produto final ou ter sido totalmente descartado. Por favor, tome esta resposta com um grão de sal e conduza novas pesquisas em que produtos são adequados agora.

Jinx vai fazer isso em tempo de execução (não estaticamente), mas pode valer a pena olhar.

Você pode querer verificar o CHESS .

Veja as respostas aqui: Quais ferramentas de análise estática estão disponíveis para o C #?

Algumas ferramentas de análise estática podem fazer a detecção de deadlock.

Além disso, tente FxCop da Microsoft.

Eu tenho experimentado sobre como rastrear facilmente aqueles. Eu tenho trabalhado para rastrear alguns deadlocks, especialmente em cenários onde muitas instruções de bloqueio diferentes são usadas.

Meu objective é detectar deadlocks antes que eles aconteçam, por exemplo, se você tem dois resources, você sabe que tem que usá-los sempre na mesma ordem, caso contrário, um deadlock pode ocorrer.

lock (lockObj1) lock (lockObj2) { // some code } 

… em outro lugar no aplicativo …

 lock (lockObj2) lock (lockObj1) // <- I expect some "possible deadlock" detection here { // some code } 

Neste caso, estou usando lockObj1, em seguida, lockObj2 em um lugar e usá-los na ordem oposta em outro lugar, isso é algo que você gostaria de evitar em um aplicativo Claro, as instruções de bloqueio não precisam ser usadas uma após a outro como no exemplo, seu aplicativo complexo pode ter vários objects complexos interagindo uns com os outros

Eu carreguei o código com os casos de teste aqui https://github.com/glmnet/LockTracer

Você já olhou para Red-Gate Ants ? Não tenho certeza se ele fará tudo que você precisa, mas é um bom produto para:

  • Identifique gargalos de desempenho em minutos
  • Otimize o desempenho do aplicativo .NET
  • Aprofundar para diminuir linhas de código com intervalos de nível de linha
  • Perfil de aspx, ASP.NET, código C # e aplicativos VB.NET