2011-11-18 30 views
25

Vorrei essere in grado di seguire solo l'esecuzione di un thread durante il debug. Io uso un threadpool così il debugger continua a passare tra i thread e questo rende il debug molto scomodo.Come eseguire il debug di un thread in Visual Studio

lettura:

ricevo una soluzione che è breakpoint condizionali (in base al nome del thread). Tuttavia, non posso dire che "il thread n. 3" sarà sempre quello che tratta il caso interessante, quindi dovrei cambiare la condizione per ogni esecuzione. Troppo lavoro.

Un'altra soluzione consiste nell'utilizzare la funzione di blocco/scongelamento per eseguire solo il mio thread interessante. Tuttavia, questo rende alcune informazioni non disponibili perché tutti i thread sono in pausa.

Quello che sto usando ora è di far funzionare il programma fino a quando non arrivo ad un breakpoint in cui sono sicuro di essere nella buona discussione. Quindi metto in pausa tutti gli altri thread di threadpool e provo a riprendere l'esecuzione. Se i programmi sembrano bloccati, metto in pausa e faccio scongelare il thread corrente.

La soluzione ideale sarebbe trovare il thread corretto, contrassegnarlo e quindi dire a Visual Studio: "interrompe solo se il thread corrente è contrassegnato".

È possibile?

+0

Quindi, qual è il criterio per la discussione del thread? – abatishchev

+0

il criterio sarebbe stop è il thread è contrassegnato – kamaradclimber

+0

Testare il codice in isolamento. Ad esempio con i test unitari. Quindi devi solo eseguire il debug dell'interazione tra thread, il tipo di debug in cui * non * vuoi bloccare i thread. –

risposta

2

Vorrei usare i breakpoint condizionali che hai menzionato, ma invece di confrontare con una stringa fissa confronta con qualche variabile semi-globale (forse una proprietà statica sulla tua classe principale?).

Quando si identifica il thread che diventa interessante, è possibile utilizzare la finestra immediata per impostare il nome della variabile e consentire il raggiungimento dei punti di interruzione condizionali.

+0

che sarebbe una possibile soluzione. Però vedo 2 svantaggi: ho bisogno di modificare il mio codolo per il debug e ho bisogno di passare attraverso una (complicata) procedura di breakpoint (1 click vs click, copy-past, 1click) – kamaradclimber

+0

Per coloro che si sintonizzano di recente (come me) I suggerire di leggere questo [risposta che elabora questa soluzione alternativa] (http://stackoverflow.com/a/38926833/1348138) un po 'oltre. Raccomando anche di votare su [il suggerimento qui citato] (http://stackoverflow.com/a/31191208/1348138). – robert4

6

Durante il debug è possibile congelare tutti i fili nella finestra Fili e riprendere solo quello che ti interessa in.

+3

grazie ma non risponde alla domanda: voglio che l'applicazione funzioni normalmente e si fermi solo sui punti di interruzione in un thread – kamaradclimber

1

un po 'tardi, ma questo ritagliata come la prima risposta in una ricerca.

Io uso il seguente in VS 2015 ...

var thread = System.Threading.Thread.CurrentThread; 
if (thread.Name == null) 
      thread.Name = "Main"; 

Poi nel punto di rottura ...

System.Threading.Thread.CurrentThread.Name == "Main" 

Per rendere più flessibile è possibile incorporare Discussione in una classe personalizzata.

Nota: non è possibile utilizzare variabili statiche in un punto di interruzione condizionale poiché non sono nel contesto. Non ho mai veramente capito perché la statica non sia sempre nel contesto.

+0

grazie per la tua risposta (anche in ritardo) dove vorresti aggiungere il primo pezzo di codice per nominare il thread? (Ho accennato aggiungendo questo nel codice richiederebbe sapere in anticipo il thread che voglio seguire) – kamaradclimber

+0

@kamaradclimber. Il prima possibile. È possibile impostare un nome thread solo una volta o c'è un'eccezione. È possibile impostare thread.Name manualmente in debug. Puoi anche dire se thread.name == xxx System.Diagnostics.Debugger.Break() – Paulustrious

+0

Scusa .. 5 minuti di timeout. @kamaradclimber. Il prima possibile. È possibile impostare un nome thread solo una volta o c'è un'eccezione. È possibile impostare thread.Name manualmente in debug o semplicemente System.Threading.Thread.CurrentThread.Name = "xyz". Puoi anche dire ... if (thread.name == xxx) {System.Diagnostics.Debugger.Break();}. Puoi dare più thread con lo stesso nome se vuoi. In passato ho aggiunto il codice sulla falsariga di bool stop = thread.Name == "someName" e quindi nel breakpoint di debugging puoi semplicemente mettere la condizione 'stop'. Rende la vita più facile – Paulustrious

Problemi correlati