Eu tenho uma solução com alguns projetos. Existem vários pontos de interrupção em diferentes projetos. Quero rastrear o primeiro thread que atingiu um desses pontos de interrupção e continuar rastreando esse thread único, apesar de outros segmentos inserirem os mesmos blocos de código.
Eu sei que isso é possível através da definição de uma condição no ponto de interrupção, ou seja, nome do thread = ... ou Id do segmento = ... mas meu caso é um aplicativo ASP.NET carregado com muita carga e assim que eu me conecto a w3wp.exe
muitos threads atingirá os pontos de interrupção. Eu preciso de algo como ThreadLocal<break-point>
.
É possível? Se sim, como?
Respostas:
Os segmentos de congelamento / descongelamento são incorretos porque outros não executam nenhum código.
A maneira mais correta e utilizável é:
No Visual Studio 2015 e mais recente, o processo é semelhante:
Portanto, todos os threads são executados, mas o depurador atinge apenas o thread atual.
fonte
System.Threading.Thread.CurrentThread.ManagedThreadId
ou algo assim?Aqui está o que eu fiz:
Defina um ponto de interrupção condicional que eu sabia que só atingiria o encadeamento que estava procurando.
Quando o ponto de interrupção for atingido e você estiver no segmento desejado, na janela Threads do Visual Studio (durante a depuração, Debug -> Windows -> Threads), Ctrl+ A(para selecionar todos os segmentos) e Ctrlclique no segmento em que está atualmente . Você deve ter todos os segmentos, exceto aquele que deseja depurar selecionado.
Agora, o Visual Studio passará apenas pelo thread descongelado. Parece ser muito mais lento ao fazer isso, presumivelmente porque ele precisa percorrer todos os threads congelados, mas trouxe alguma sanidade à minha depuração multiencadeada.
fonte
Acabei de lançar uma extensão do Visual Studio 2010 ou superior que faz exatamente o que você está procurando. E é grátis :).
Confira aqui na Galeria , na página oficial ou no repositório do Github .
fonte
Se vários threads estiverem sendo gerados como em um aplicativo da Web, as respostas do @MattFaus não funcionarão. o que eu fiz é o seguinte
fonte
Uma abordagem um pouco diferente que eu usei:
Isso pressupõe que você tenha tempo para fazer o procedimento acima antes que um segundo thread atinja seu ponto de interrupção. Se não, e outros threads atingem seu ponto de interrupção antes de fazer o acima, clique com o botão direito do mouse na janela de threads e escolha congelar.
fonte
lock(m_someObject) { ; }
No VS 2019:
fonte
Sugiro adicionar outra instância do aplicativo no servidor ativo, no mesmo hardware ou em uma nova máquina (agrupe-a) e depois depure apenas essa instância. Eu não adicionaria um ponto de interrupção no código que os usuários estão acionando. Se isso não for uma opção, eu adicionaria mais rastreamentos.
No entanto, se isso for absolutamente necessário e você precisar de uma estatística da solução, tenho certeza de que poderá adicionar um ponto de interrupção que interrompa apenas se a solicitação vier do seu endereço IP. Você faria isso adicionando um ponto de interrupção condicional que inspeciona
HttpContext.Request.UserHostAddress
. Observe, no entanto, que isso torna o aplicativo consideravelmente mais lento.fonte
Se você não deseja parar todos os outros segmentos (talvez esteja anexando o depurador do Visual Studio a um aplicativo em execução que precise responder a solicitações), use uma macro que crie e remova pontos de interrupção automaticamente.
Isso é sugerido em uma resposta à pergunta Stack Overflow "Step over" ao depurar programas multithread no Visual Studio .
No entanto, o link explica apenas como depurar linha por linha. Eu sugiro que você modifique a macro (se você estiver confortável com ela) para fazê-la modificar todos os pontos de interrupção (em um determinado intervalo de linhas, por exemplo) para parar apenas no thread atual.
fonte
Eu acho que isso é um pouco diferente no Visual Studio 2015. Eles mudaram algumas coisas nos pontos de interrupção, mas aqui está como aplicar a resposta aceita do hzdbyte (acima):
No ponto de interrupção na margem de codificação, clique com o botão direito do mouse> Condições> Alterar de 'Expressão condicional' para 'Filtro'. Isso permite filtrar por ThreadId.
Como alternativa, no ponto de interrupção na janela Pontos de interrupção, clique com o botão direito do mouse> Configurações> marque a caixa Condições e faça o acima.
fonte
Defina uma condição de ponto de interrupção clicando com o botão direito do mouse na barra lateral da linha. Selecione "Condição" e digite o seguinte com o nome do seu segmento entre aspas:
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
Como alternativa, você pode fazer o mesmo obtendo o "ID gerenciado" do thread na janela "Threads" e use:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
fonte