Partilhar via


Passo a passo: Depurar um aplicativo multithread usando a janela Threads (C#, Visual Basic, C++)

Vários elementos da interface do usuário do Visual Studio ajudam a depurar aplicativos multithreaded. Este artigo apresenta recursos de depuração multithreaded na janela do editor de código, barra de ferramentasLocal de Depuração e na janela Threads. Para mais informações sobre outras ferramentas para depurar aplicativos multithreaded, consulte Introdução à depuração de aplicativos multithreaded.

Concluir este tutorial leva apenas alguns minutos e vai te familiarizar com os conceitos básicos de depuração de aplicativos multithreaded.

Crie um projeto de aplicativo multithreaded

Crie o seguinte projeto de aplicativo multithreaded para ser usado neste tutorial:

  1. Abra o Visual Studio e crie um projeto.

    Se a janela inicial não estiver aberta, acesse Arquivo>Janela Inicial.

    Na tela Iniciar, selecione Novo projeto.

    Na tela Iniciar, selecione Criar um novo projeto.

    Na janela Criar um novo projeto, insira ou digite console na caixa de pesquisa. Em seguida, escolha C# ou C++ na lista Linguagem de programação e, em seguida, escolha Windows na lista Plataforma.

    Depois de aplicar os filtros de linguagem de programação e plataforma, escolha o Aplicativo de Console para .NET Core, .NET 5+ ou C++ e clique em Avançar.

    Observação

    Caso não veja o modelo correto, vá em Ferramentas>Obter Ferramentas e Recursos..., que abre o Instalador do Visual Studio. Escolha a carga de trabalho Desenvolvimento para desktop com .NET ou Desenvolvimento para desktop com C++ e, em seguida, selecione Modificar.

    Na janela Configurar seu novo projeto, digite um nome ou use o nome padrão na caixa Nome do projeto. Depois, clique em Avançar ou Criar, qualquer uma dessas opções que estiver disponível.

    Para .NET Core ou .NET 5+, escolha a estrutura de direcionamento recomendada ou o .NET 8 e, em seguida, escolha Criar.

    Um novo projeto de console é exibido. Quando o projeto tiver sido criado, um arquivo de origem aparecerá. Dependendo da linguagem escolhida, o arquivo de origem poderá ser chamado Program.cs ou MyThreadWalkthroughApp.cpp.

  2. Substitua o código no arquivo de origem pelo código de exemplo C# ou C++ deIntrodução à depuração de aplicativos multithreaded.

  3. Selecione Arquivo>Salvar Todos.

Iniciar a depuração

  1. Localize as seguintes linhas no código-fonte:

    Thread.Sleep(3000);
    Console.WriteLine();
    
  2. Defina um ponto de interrupção na Console.WriteLine(); linha clicando na medianiz esquerda ou selecionando a linha e pressionando F9.

    O ponto de interrupção aparece como um círculo vermelho na medianiz esquerda ao lado da linha de código.

  3. Pressione Depurar>Iniciar Depuração, ou pressione F5.

    O aplicativo inicia o modo de depuração e pausa no ponto de interrupção.

  4. Enquanto estiver no modo de interrupção, abra a janela Threads selecionando Depurar>Threads> do Windows. Você deve estar em uma sessão de depuração para abrir ou consultar os Threads e outras janelas de depuração.

Examinar marcadores de thread

  1. No código-fonte, localize a Console.WriteLine(); linha.

    1. Clique com o botão direito do mouse na janela Threads e selecione Mostrar Threads na Origem Mostrar Threads na Origem no menu.

    A medianiz ao lado da linha de código-fonte agora exibe um ícone marcador de threadMarcador de Thread. O marcador de thread indica que um thread está parado nesse local. Se houver mais de um thread parado no local, o ícone múltiplos threads aparece.

  2. Passe o ponteiro sobre o marcador de thread. Uma Dica de Dados é exibida, mostrando o nome e o número de ID da thread para o(s) thread(s) interrompido(s). Os nomes da thread podem ser <No Name>.

    Dica

    Para ajudar a identificar threads sem nome, você pode renomeá-los na janela Threads . Clique com o botão direito do mouse no thread e selecione Renomear.

  3. Clique com o botão direito do mouse no marcador de thread no código-fonte para ver as opções disponíveis no menu de atalho.

Sinalizar e remover sinalizador de threads

Você pode sinalizar threads para acompanhar as threads aos quais deseja prestar atenção especial.

Sinalize e remova o sinalizador das threads do editor de código-fonte ou da janela Threads . Escolha se deseja exibir apenas as threads sinalizados ou todos as threads nas barras de ferramentasLocal de Depuração ou Threads As seleções feitas de qualquer local afetam todos os outros locais.

Sinalize e remova o sinalizador das threads no código-fonte

  1. Abra a barra de ferramentas Local de Depuração clicando em Exibir>as Barra de ferramentas do>Local de Depuração. Você também pode clicar com o botão direito do mouse na área da barra de ferramentas e clicar em Local de Depuração.

  2. A barra de ferramentas Local de Depuração tem três campos: Processo, Threade Registro de ativação. Solte a lista Thread e observe quantos threads existem. Na lista Thread, o thread em execução no momento está marcado com um > símbolo.

  3. Na janela do código-fonte, passe o mouse sobre um ícone de marcador de thread na medianiz e selecione o ícone de sinalizador (ou um dos ícones de sinalizador vazio) na Dica de Dados. O ícone do sinalizador fica vermelho.

    Você também pode clicar com o botão direito do mouse em um ícone de marcador de thread, apontar para o Sinalizador e selecionar um thread para sinalizar no menu de atalho.

  4. Na barra de ferramentas Local de Depuração, selecione o ícone Mostrar Somente ThreadsMostrar Threads Sinalizados, no lado direito do campo Thread. O ícone fica acinzentado, a menos que um ou mais threads sejam sinalizados.

    Somente o thread sinalizado agora aparece na lista suspensa de Thread na barra de ferramentas. Para mostrar todos os threads novamente, selecione o ícone Mostrar Somente Threads Sinalizados novamente.

    Dica

    Depois de sinalizar alguns threads, você pode posicionar o cursor no editor de código, clicar com o botão direito do mouse e selecionar Executar Threads Sinalizados com o Cursor. Certifique-se de escolher os códigos que será atingidos por todos os threads sinalizados. Executar Threads Sinalizados com o Cursor pausará as threads na linha de código selecionada, facilitando o controle da ordem de execução congelando e descongelando threads.

  5. Para alternar o status sinalizado ou não sinalizado do thread em execução atualmente, selecione o único botão de barra de ferramentas Alternar Estado Sinalizado do Thread Atual, no lado esquerdo do botão Mostrar Somente Threads Sinalizados Sinalizar o thread atual é útil para localizá-lo quando apenas threads sinalizados são exibidos.

  6. Para desmarcar um thread, passe o mouse sobre o marcador de thread no código-fonte e selecione o ícone de sinalizador vermelho para desmarcar ou clique com o botão direito do mouse no marcador de thread e clique em Desmarcar.

Sinalizar e remover threads na janela Threads

Na janela Threads, os threads sinalizados têm ícones de sinalizador vermelho ao lado, enquanto os threads não marcados, se mostrados, têm ícones de contorno vazios.

Janela de Threads

Selecione um ícone de sinalizador para alterar o estado do thread para sinalizado ou não marcado, dependendo do estado atual.

Você também pode clicar com o botão direito do mouse em uma linha e selecionar Sinalizar, Desmarcarou Desmarcar Todos os Threads no menu de atalho.

A barra de ferramentas da janela Threads também tem um botão Mostrar Somente Threads Sinalizados, que está do lado direito de um dos dois ícones de sinalizador. Funciona da mesma forma que o botão na barra de ferramentas Local de Depuração e qualquer um dos botões controla a exibição em ambos os locais.

Outros recursos da janela Threads

Na janela Threads, selecione o cabeçalho de qualquer coluna para classificar os threads por essa coluna. Selecione novamente para reverter a ordem de classificação. Se todos os threads estiverem sendo exibidos, a seleção da coluna de ícone de sinalizador classificará os threads por status sinalizado ou não marcado.

A segunda coluna da janela Threads (sem cabeçalho) é a coluna Thread Atual. Uma seta amarela nesta coluna marca o ponto de execução atual.

A coluna Local mostra onde cada thread aparece no código-fonte. Selecione a seta de expansão ao lado da entrada Local ou passe o mouse sobre a entrada para mostrar uma pilha de chamadas parcial para esse thread.

Dica

Para obter uma exibição gráfica das pilhas de chamadas para threads, use a janela Pilhas Paralelas . Para abrir a janela, durante a depuração, selecione Depurar>Windows>Pilhas Paralelas.

Além de Sinalizar, Desmarcare Desmarcar Todos os Threads, o clique com o botão direito no menu de atalho para os itens da janela Thread tem:

  • O botão Mostrar Threads na Fonte .
  • A exibiçãohexadecimal, que altera as IDsdo Thread na janela Threads de formato decimal para hexadecimal.
  • Alterne para o Thread, que alterna imediatamente a execução para esse thread.
  • Renomeie, o que permite alterar o nome do thread.
  • Comandos de Congelar e Descongelar .

Congelar e descongelar a execução do thread

Você pode congelar e descongelar, ou suspender e retomar, threads para controlar a ordem na qual os threads executam o trabalho. Congelar e descongelar threads pode ajudá-lo a resolver problemas de simultaneidade, como deadlocks e condições de corrida.

Dica

Para seguir um único thread sem congelar outros threads, que também é um cenário de depuração comum, consulte Introdução à depuração de aplicativos multithreaded.

Para congelar e descongelar threads:

  1. Na janela Threads, clique com o botão direito em qualquer thread e clique em Congelar. Um ícone de Pausa na coluna Thread Atual indica que o thread está congelado.

  2. Selecione Colunas na barra de ferramentas da janela Threads e selecione Contagem Suspensa para exibir a coluna Contagem Suspensa. O valor de contagem suspensa para o thread congelado é 1.

  3. Clique com o botão direito do mouse no thread congelado e selecione Descongelar.

    O ícone Pausar desaparece e o valor da Contagem Suspensa é alterado para 0.

Alternar para outro thread

Você pode ver que uma mensagem: O aplicativo está na janela de modo de interrupção quando você tenta alternar para outro thread. Essa janela informa que o thread não tem nenhum código que o depurador atual possa exibir. Por exemplo, você pode estar depurando o código gerenciado, mas o thread é um código nativo. A janela oferece sugestões para resolver o problema.

Para alternar para outro thread:

  1. Na janela Threads , anote a ID do thread atual, que é o thread com uma seta amarela na coluna Thread Atual. Você desejará voltar para esse thread para continuar seu aplicativo.

  2. Clique com o botão direito do mouse em um thread diferente e selecione Alternar para Thread no menu de contexto.

  3. Observe que o local da seta amarela foi alterado na janela Threads . O marcador de thread atual original também permanece, como uma estrutura de tópicos.

    Examine a dica de ferramenta no marcador de thread no editor de código-fonte e a lista na lista suspensa Thread na barra de ferramentas Localização de Depuração. Observe que o thread atual também foi alterado lá.

  4. Na barra de ferramentas Local de Depuração , selecione um thread diferente na lista Thread . Observe que o thread atual também muda nos outros dois locais.

  5. No editor de código-fonte, clique com o botão direito do mouse em um marcador de thread, aponte para Alternar para Threade selecione outro thread na lista. Observe que o thread atual é alterado nos três locais.

Com o marcador de thread no código-fonte, você pode alternar apenas para threads que são interrompidos nesse local. Ao usar a janela Threads e a barra de ferramentas Localização de Depuração, você pode alternar para qualquer thread.

Agora você aprendeu as noções básicas de depuração de aplicativos multithreaded. Você pode observar, sinalizar e marcar, congelar e descongelar threads usando a janela Threads, a lista Thread na barra de ferramentas Local de Depuração ou marcadores de thread no editor de código-fonte.