2010-02-23 25 views
5

Sto sviluppando un'applicazione WinForm multithread con C#. A volte capita che la mia applicazione si blocchi, o blocchi o blocchi.Sapere A che punto l'applicazione si blocca

Quando questo accade e sto correndo in modalità DEBUG, c'è comunque da capire a quale riga di codice è attualmente la mia applicazione? Poiché è bloccato, mi aspetto di trovare un punto in cui l'applicazione è bloccata o bloccata o altro. È possibile farlo in qualche modo?

Quando è bloccato ho provato ad aprire la finestra CALL STACK, ma questa non mostra alcuna informazione; c'è qualche azione che potrei fare? Alcuni "pausa e controllo" o qualsiasi altra cosa?

risposta

5

Potrebbe essere necessario aprire la finestra Thread e modificare il thread corrente. Durante il debug, scegli Debug-> Break All e apri la finestra Threads. Se si passa attraverso ciascun thread, facendo doppio clic sul thread, si dovrebbe essere in grado di esaminare lo stack di chiamate per ogni thread.

Detto questo, se è possibile eseguire il programma in VS 2010, questo diventa molto più semplice. In VS 2010, è possibile utilizzare il nuovo Concurrency Profiler ed eseguire il codice in Concurrency Profiler con l'opzione per visualizzare il comportamento di un'applicazione multithread. Una volta bloccata la tua applicazione, uccidila e lascia che il profiler si abbandoni -

Alla fine, otterrai un diagramma che mostra ogni thread nel programma e quando sono bloccati. Verranno visualizzati il ​​callstack per ogni thread bloccato, nonché il blocco (con la riga del codice sorgente). Questo rende molto facile rintracciare un blocco morto.

+0

Ciao Reed! Grazie mille per la tua grande risposta! Ancora una piccola cosa se sei ancora in giro ... Non ho VS 2010 e sto ancora usando VS 2008. Sai se c'è qualche buono strumento gratuito che produce più o meno la stessa cosa che hai appena descritto per i diagrammi di thread? Grazie per l'aiuto. –

+0

No, non so nulla di ciò che è gratuito. Il toolkit di threading di Intel funziona (ma è molto costoso). Puoi scaricare VS 2010 RC Ultimate gratuitamente adesso e lanciarlo sui tuoi progetti, però ... –

+0

Ciao Reed! Grazie mille per il tuo aiuto! Buona giornata! –

2

Quando il debugger è collegato andare al menu Debug e scegliere 'Break All' ... Quindi è possibile esaminare gli stack di chiamata per tutti i thread.

+0

Fantastico! Grazie uomo! –

2

È possibile premere la pausa e vedere dove finisce (utilizzare la finestra stack di chiamate sopra indicata). È comunque probabile che finirai con il codice nativo. Si potrebbe provare a uscire un po 'o semplicemente a guardare lo stack per una funzione gestita per il debug.

In alternativa è possibile inserire un punto di interruzione dopo che l'applicazione "si blocca" e provare a individuare un loop che non termina.

Entrambi i precedenti presuppongono che l'applicazione sia occupata (utilizzo della CPU al 100%). Se la tua applicazione è comunque bloccata in un dead lock o semplicemente in attesa di un mutex che non ticcherà, dovrai rileggere manualmente il tuo codice e provare a capirlo da solo.

+0

Auch! Veramente? Leggere manualmente il codice è l'unico modo per capire dove ho un deadlock? Tempo fa ho letto di un potente strumento chiamato WinDbg. Hai mai usato e sai se quel tavolo è in grado di aiutarmi a scoprire a quale pezzo di codice l'applicazione è stucked_ –

+0

Beh, se sei in un deadlock, il thread è bloccato in una funzione da qualche parte nel profondo dll rtl finché la condizione non viene determinata dallo scheduler. Una pila di chiamate non ti dirà quale condizione è in attesa. – Blindy