2010-03-04 9 views
39

C'è uno strumento che analizza il codice .NET e trova condizioni di gara?C# /. NET strumento di analisi per trovare condizioni di gara/deadlock

Ho un po 'di codice che ha una proprietà statica pubblica che ottiene o crea un campo statico privato. Ha anche un metodo statico pubblico che imposta questo campo su null (... sì, lo so! ..)

Poiché non ci sono blocchi attorno a nessuno di questi metodi, è una scommessa sicura che le cose andranno orribilmente sbagliato in futuro. Ho bisogno di uno strumento che ricorsivamente passerà attraverso le cose che chiamano uno di questi metodi e vedere se qualcosa è stato generato su un altro thread.

Sto cercando uno strumento o uno script SQL nDepend (se possibile).

+8

oooh, davvero utile lì John, vuoi dire su e di tutti quegli annunci che ruotano intorno? Probabilmente sarebbe di grande aiuto se tu dicessi * quale * annuncio, o appena menzionato il prodotto o la società per cui era un annuncio. O è solo "se guardi il sito ..."? –

risposta

19

Probabilmente siete alla ricerca di uno di questi:


NOTA: Questa risposta è dal 2010. Come per tutte le raccomandazioni risposte, le raccomandazioni tendono a cambiare nel tempo. Potrebbero esserci altri prodotti là fuori ora, CHESS, che era un progetto di Microsoft Research Labs potrebbe essersi evoluto in un prodotto finale o essere stato completamente demolito. Si prega di prendere questa risposta con un pizzico di sale e condurre nuove ricerche su quali prodotti sono adatti ora.

+0

Grazie Lasse, Avevo sentito parlare di Scacchi ma non di TypeMock Racer. Ero davvero alla ricerca di uno strumento che facesse l'analisi statica del codice. Sto usando ReSharper 5, che ha una bella funzionalità che controlla il codice e mostra tutti i chiamanti di un particolare metodo e analizza in modo ricorsivo in modo ricorsivo. Quello di cui ho bisogno è qualcosa che contrassegna un metodo come istanziato su un thread di lavoro. Investirò maggiormente sull'approccio CQL, poiché so che c'è uno script per i chiamanti a monte, quindi sono sicuro che c'è un modo per scoprire se alcuni metodi sono il risultato di una chiamata di chiamata thread. –

+0

Questo [fork of chess] (https://github.com/LeeSanderson/Chess) sembra essere aggiornato e funzionante. – zejuel

3

Si potrebbe voler controllare CHESS.

4

Jinx lo eseguirà in fase di esecuzione (non in modo statico) ma potrebbe valerne la pena.

+0

Bello. L'analisi runtime è di gran lunga superiore all'analisi statica dei problemi di concorrenza. C'è troppa convenzione di runtime per gli analizzatori statici per produrre un buon rapporto segnale-rumore. –

+0

sembra che Jinx sia pane tostato. – tofutim

+0

Wikipedia: Jinx era un debugger di concorrenza che controlla in modo deterministico l'interleaving dei carichi di lavoro tra i core del processore, concentrandosi sulle interazioni di memoria condivisa. Usando questo approccio deterministico, Jinx mirava ad aumentare la frequenza di occorrenza di elusivi bug di memoria condivisa, a volte chiamati Heisenbugs. Jinx non è più disponibile. Corensic, la società che stava sviluppando Jinx, è stata acquistata da F5 Networks e il progetto Jinx è stato annullato. – tofutim

0

Hai guardato Red-Gate Ants? Non sono sicuro se lo farà tutto il necessario, ma è un buon prodotto per:

  • identificare i colli di bottiglia delle prestazioni in pochi minuti
  • Ottimizzare le prestazioni delle applicazioni .NET
  • Drill-down per rallentare righe di codice con temporizzazioni a livello di linea
  • Profilo aspx, ASP.NET, C# codice, e VB.NET applicazioni
2

Ho sperimentato su come tracciare facilmente quelli. Ho lavorato per tenere traccia di alcuni deadlock, specialmente su scenari in cui vengono utilizzate molte istruzioni di blocco diverse.

Il mio obiettivo è rilevare i deadlock prima che si verifichino, ad es. se hai due risorse, sai che devi sempre usarle nello stesso ordine, altrimenti si verificherà un deadlock .

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

...da qualche altra parte in app ...

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

In questo caso sto usando lockObj1 poi lockObj2 in un luogo e utilizzando nell'ordine opposto in un altro luogo, questo è qualcosa che ti piacerà di evitare in un'applicazione Naturalmente, le dichiarazioni di blocco non è necessario per essere utilizzato uno dopo l'altro come nell'esempio, l'applicazione complesso potrebbe avere diversi oggetti complessi che interagiscono tra loro

ho caricato il codice con i casi di test qui https://github.com/glmnet/LockTracer

+2

Questa è un'idea molto interessante. Ispirato dal tuo codice ho scritto qualcosa di simile, assegnando un "numero di priorità" a ciascun blocco, e poi controllando che ogni volta che ricevevo più lucchetti li ho presi in "ordine di priorità". Abbastanza sicuro, questo ha immediatamente rivelato che c'era un posto nel mio programma in cui avevo infranto la mia regola sull'ordinamento delle acquisizioni di blocco, e sistemando ciò ho risolto la mia vulnerabilità deadlock. – RenniePet

+1

Sembra più semplice, ma efficace! Potresti condividerlo su GitHub? Non dimenticare di upvotare se non l'hai fatto. Grazie! –

Problemi correlati