Ho un'applicazione con 4 thread che funzionano con lo stesso codice. Tuttavia, quando passo, salta tra i diversi thread. Come posso bloccarlo su un thread in modo che gli altri thread vengano ignorati per il debug?
Ho un'applicazione con 4 thread che funzionano con lo stesso codice. Tuttavia, quando passo, salta tra i diversi thread. Come posso bloccarlo su un thread in modo che gli altri thread vengano ignorati per il debug?
Risposte:
Sì.
Nella finestra Thread (Debug -> Windows -> Thread) fai clic con il pulsante destro del mouse sul thread desiderato e seleziona "passa al thread".
Puoi anche scegliere "congela" sui thread di cui non vuoi eseguire il debug per impedirne l'esecuzione. Non dimenticare di "scongelarli" se ti aspetti che funzionino comunque.
Il passaggio singolo attraverso un singolo thread sembra essere risolto principalmente in VS 2012 (con alcuni avvertimenti che puoi vedere nel mio link qui sotto). I punti di interruzione sono un dolore.
Il congelamento e lo scongelamento dei thread è la solita soluzione alternativa, come indicato nelle risposte precedenti, ma è noioso e può causare blocchi quando il thread attende un altro thread bloccato. Questi possono essere difficili da recuperare senza perdere il posto nel thread di interesse.
Un altro flusso di lavoro utile è applicare un filtro thread sui punti di interruzione, indicato anche in alcune delle risposte:
Crea un punto di interruzione, fai clic con il pulsante destro del mouse sul punto di interruzione, fai clic su Filtro e inserisci ThreadId = 7740 (l'id del thread dalla finestra dei thread).
Questo può essere molto noioso.
Il mio suggerimento a Microsoft è di correggere il singolo stepping (e le relative varianti) per non cambiare mai thread a meno che un breakpoint esplicito non venga raggiunto in un altro thread. Dovrebbero anche aggiungere una scorciatoia (forse Ctrl-F9) per creare un punto di interruzione con l'id thread corrente come filtro. Ciò renderebbe il secondo flusso di lavoro molto più conveniente.
Vota il suggerimento se sei d'accordo che sarebbe utile o aggiungi i tuoi suggerimenti:
Puoi anche inserire un breakpoint condizionale nel tuo codice e mettere la condizione di breakpoint thread.Id == [someValue]
o Thread.Name == "[Somename]"
...
Esiste una soluzione molto più rapida per casi semplici: vedere i commenti nel collegamento di Steve.
il debugger completerà sempre e solo un passaggio sul thread da cui è stato originato il passaggio. Quindi, se colpisci un breakpoint, disabilitalo e poi inizi a fare un passo non dovresti fermarti su un thread diverso. Se hai altri punti di interruzione nella tua applicazione e un altro thread ne colpisce uno, eseguirai il debug nello stato di thread misto come descritto
Quindi nel mio caso una volta che i vari thread hanno iniziato a colpire il mio punto di interruzione, ho semplicemente premuto Continua alcune volte fino a quando non ho identificato la chiamata che stavo cercando, quindi ho rimosso il punto di interruzione e ho attraversato il resto del codice rimanendo sullo stesso thread senza interferenze da il resto di loro.
Questo ovviamente diventa un problema se si hanno più punti di interruzione che si desidera mantenere, ecc. - Ancora una volta per casi semplici è molto più facile da fare.
Questo ricorda fortemente un problema molto simile in Visual Studio 2008 SP1. È stato risolto con un aggiornamento rapido post-SP. Ma ci sono altre prove che l'aggiornamento rapido non è stato incorporato nella base di codice, anche questo elemento di feedback è stato un problema. Non è insolito che gli hotfix non si reintegrino.
Non esiste un articolo di feedback che descriva esattamente il tuo problema, almeno quello che posso trovare. Ti consiglierei di archiviarne uno. Dato il solito problema con la riproduzione di bug come questo, ti consiglio vivamente di includere un progetto di riproduzione che mostri questo problema con le istruzioni su come riprodurre il problema.
Esiste una sorta di soluzione alternativa per il tuo problema, potresti andare in Debug + Windows + Thread, fare clic con il pulsante destro del mouse sui thread che non desideri eseguire il debug e selezionare Blocca. Non dimenticare di scongelarli più tardi.
Questi bug sono stati corretti nuovamente in Visual Studio 2010 Service Pack 1.
Sto usando Visual Studio Professional 2017 e utilizzo la finestra Thread per bloccare e scongelare selettivamente i thread. Di solito ho più thread dello stesso codice e voglio solo congelarli, non altri. In realtà mi piace la finestra Discussioni MS perché posso selezionare un sottoinsieme di thread da bloccare. Raggruppo i thread per nome e posso quindi congelare tutti quelli che eseguono lo stesso codice di cui sto eseguendo il debug lasciando che i thread rimanenti vengano eseguiti. Ho provato a utilizzare l'estensione Erwin Mayer, e ha funzionato molto bene, ma congela tutti i thread tranne quello che sto eseguendo e a volte mi trovo in una situazione in cui il debug non raggiunge il punto di interruzione penso che dovrebbe, quindi perché tutto il gli altri thread vengono arrestati e l'applicazione sembra interrotta. Colpire il pulsante Pausa e sbloccare i thread nella finestra dei thread risolve il problema.
5. Passa attraverso un singolo thread senza saltare
Con quale frequenza esegui il debug del codice multithread, quando raggiungi il tuo primo punto di interruzione, fai un passo e improvvisamente ti fermi con la freccia gialla su un altro thread? Il comportamento imprevisto viene dal punto di interruzione ancora impostato e di conseguenza colpito. Per impostazione predefinita, il debugger si interrompe su un punto di interruzione ogni volta che viene colpito. Ciò significa che quando si esegue un passaggio, tutti i thread possono essere eseguiti e uno dei thread in esecuzione raggiunge questo punto di interruzione prima che il passaggio venga completato sul thread corrente. La prossima volta che ti trovi in questa situazione prova questo:
- Disabilita o elimina il punto di interruzione che è stato colpito dal nuovo thread a cui è passato il debugger.
- Premi Continua (F5)
- Osserva come viene completato il tuo primo passo iniziale su quel primo thread e ora è il contesto di debug attivo.
- Poiché i tuoi punti di interruzione vengono eliminati o disabilitati, puoi continuare a calpestare quel singolo thread senza interruzioni.