Eu tenho um aplicativo com 4 threads trabalhando o mesmo código. No entanto, quando eu pulo, ele pula entre os diferentes segmentos. Como posso bloqueá-lo em um thread para que os outros threads sejam ignorados para depuração?
Eu tenho um aplicativo com 4 threads trabalhando o mesmo código. No entanto, quando eu pulo, ele pula entre os diferentes segmentos. Como posso bloqueá-lo em um thread para que os outros threads sejam ignorados para depuração?
Respostas:
Sim.
Na janela Threads (Debug -> Windows -> Threads), clique com o botão direito do mouse no segmento desejado e selecione "alternar para o segmento".
Você também pode escolher "congelar" nos threads que não deseja depurar para impedir a execução. Não se esqueça de "descongelar" se você espera que eles funcionem, no entanto.
O passo único através de um único thread parece ser corrigido principalmente no VS 2012 (com algumas ressalvas que você pode ver no meu link abaixo). Pontos de interrupção são uma dor.
Congelar e descongelar threads é a solução alternativa usual, como as respostas anteriores declararam, mas é tedioso e pode causar travamentos quando o thread aguarda outro segmento congelado. Isso pode ser difícil de recuperar sem perder seu lugar no seu segmento de interesse.
Outro fluxo de trabalho útil é aplicar um filtro de encadeamento em seus pontos de interrupção, também declarados em algumas das respostas:
Crie um ponto de interrupção, clique com o botão direito do mouse no ponto de interrupção, clique em Filtro e insira ThreadId = 7740 (seu ID de thread na janela de threads).
Isso pode ser muito entediante.
Minha sugestão para a Microsoft é corrigir uma etapa única (e variações dela) para nunca alternar segmentos, a menos que um ponto de interrupção explícito seja atingido em outro segmento. Eles também devem adicionar um atalho (talvez Ctrl-F9) para criar um ponto de interrupção com o ID do encadeamento atual como filtro. Isso tornaria o segundo fluxo de trabalho muito mais conveniente.
Vote na sugestão se você concorda que isso seria útil ou adicione suas próprias sugestões:
Você também pode colocar um ponto de interrupção condicional no seu código e colocar a condição thread.Id == [someValue]
ou Thread.Name == "[Somename]"
na condição de ponto de interrupção ...
Existe uma solução muito mais rápida para casos simples - veja os comentários no link de Steve.
o depurador apenas concluirá uma etapa no thread do qual a etapa foi originada. Portanto, se você atingir um ponto de interrupção, desative-o e, em seguida, comece a pisar, não pare em um segmento diferente. Se você tiver outros pontos de interrupção no seu aplicativo e outro encadeamento atingir um, você estará depurando no estado de encadeamento misto, conforme descrito
Portanto, no meu caso, uma vez que os vários threads começaram a atingir meu ponto de interrupção, apenas pressione Continuar algumas vezes até identificar a chamada que estava procurando - depois removi o ponto de interrupção e percorri o restante do código enquanto permanecia no mesmo segmento sem interferência de o resto deles.
Obviamente, isso se torna um problema se você tiver vários pontos de interrupção que deseja manter etc. - mas novamente em casos simples, isso é muito mais fácil.
Isso se parece muito com um problema muito semelhante no Visual Studio 2008 SP1. Foi corrigido com um hotfix pós-SP. Mas há outras evidências de que o hotfix não foi incorporado à base de código, este item de feedback também foi um problema. Não é incomum que os hotfixes não sejam integrados novamente.
Não há um item de feedback que descreva exatamente o seu problema, pelo menos que eu possa encontrar. Eu recomendo que você arquive um. Dado o problema usual com erros de reprodução como esse, recomendo fortemente que você inclua um projeto de reprodução que exiba esse problema com instruções sobre como reproduzir o problema.
Há uma solução alternativa para o seu problema; você pode acessar Debug + Windows + Threads, clicar com o botão direito do mouse nos threads que não deseja depurar e selecionar Congelar. Não esqueça de descongelar depois.
Esses erros foram corrigidos novamente no Visual Studio 2010 Service Pack 1.
Estou usando o Visual Studio Professional 2017 e uso a janela Threads para congelar e descongelar seletivamente os threads. Normalmente, tenho vários threads do mesmo código e quero congelá-los, não outros. Na verdade, eu gosto da janela MS Threads porque posso selecionar um subconjunto de threads para congelar. Eu agrupo os threads por nome e, em seguida, posso congelar todos os que executam o mesmo código que eu estou depurando enquanto deixo os threads restantes serem executados. Tentei usar a extensão Erwin Mayer e funcionou muito bem, mas congela todos os threads, exceto o que estou executando, e às vezes me deparo com uma situação em que a depuração não atinge o ponto de interrupção que eu acho que deveria, porque todos os outros threads são interrompidos e o aplicativo parece interrompido. Pressionar o botão de pausa e descongelar os threads na janela de threads corrige esse problema.
5. Passe por uma única linha sem pular
Quantas vezes você está depurando código multithread, quando você atinge seu primeiro ponto de interrupção, dá um passo e, de repente, você é parado com a seta amarela em outro segmento? O comportamento inesperado vem do ponto de interrupção ainda sendo definido e, consequentemente, atingido. Por padrão, o depurador irá parar em um ponto de interrupção sempre que for atingido. Isso significa que, quando você dá um passo, todos os threads têm permissão para executar, e um dos threads em execução atinge esse ponto de interrupção antes que a etapa seja concluída no thread atual. Da próxima vez que você entrar nessa situação, tente o seguinte:
- Desative ou exclua o ponto de interrupção que foi atingido pelo novo thread ao qual o depurador alternou.
- Pressione Continuar (F5)
- Observe como sua primeira etapa inicial nesse primeiro thread é concluída e agora é o contexto de depuração ativo.
- Como seus pontos de interrupção são excluídos ou desabilitados, você pode continuar pisando nesse thread único sem interrupção.