Compartilhar via


Depurar aplicativos multithread no Visual Studio

Um thread é uma sequência de instruções às quais o sistema operacional concede tempo de processador. Cada processo em execução no sistema operacional consiste em pelo menos um thread. Os processos que têm mais de um thread são chamados de multithreaded.

Computadores com vários processadores, processadores de vários núcleos ou processos de hiperthreading podem executar vários threads simultâneos. O processamento paralelo usando muitos threads pode melhorar muito o desempenho do programa, mas também pode dificultar a depuração porque você está acompanhando muitos threads.

O processamento paralelo perfeito nem sempre é possível. Às vezes, os threads devem ser sincronizados. Um thread pode ter que esperar por um resultado de outro thread, ou um thread pode precisar de acesso exclusivo a um recurso que outro thread está usando. Problemas de sincronização são uma causa comum de bugs em aplicativos multithreaded. Às vezes, os threads podem acabar aguardando um recurso que nunca fica disponível. Isso resulta em uma condição chamada deadlock.

Threads e processos

Threads e processos são conceitos relacionados na ciência da computação. Ambos representam sequências de instruções que devem ser executadas em uma ordem específica. No entanto, as instruções em threads ou processos separados podem ser executadas em paralelo.

Os processos existem no sistema operacional e correspondem ao que os usuários veem como programas ou aplicativos. Um thread, por outro lado, existe dentro de um processo. Por esse motivo, os threads às vezes são chamados de processos leves. Cada processo consiste em um ou mais threads.

A existência de vários processos permite que um computador execute mais de uma tarefa por vez. A existência de vários threads permite que um processo separe o trabalho a ser executado em paralelo. Em um computador com vários processadores, processos ou threads podem ser executados em processadores diferentes. Isso habilita o processamento paralelo verdadeiro.

Ferramentas para depurar aplicativos multithreaded

O Visual Studio fornece ferramentas diferentes para uso na depuração de aplicativos multithreaded.

  • Para depurar threads na GPU, a ferramenta principal é a janela Threads de GPU . Veja como usar a janela Threads de GPU.

  • Para processos, as ferramentas primárias são a caixa de diálogo Anexar ao Processo , a janela Processos e a barra de ferramentas Local de Depuração .

O Visual Studio também fornece pontos de interrupção e pontos de rastreamento avançados, que podem ser úteis quando você depura aplicativos multithread. Use condições de ponto de interrupção e filtros para colocar pontos de interrupção em threads individuais. Os pontos de rastreamento permitem que você rastreie a execução do programa sem interrupções, para estudar problemas como deadlocks. Para obter mais informações, consulte Ações de ponto de interrupção e pontos de rastreamento.

A depuração de um aplicativo multithread que tem uma interface do usuário pode ser especialmente difícil. Você pode considerar executar o aplicativo em um segundo computador e usar a depuração remota. Para obter mais informações, consulte Depuração remota.

A tabela a seguir mostra as informações disponíveis e as ações que você pode executar em cada um desses locais:

Interface do Usuário Informações disponíveis Ações que você pode executar
Caixa de diálogo Anexar ao Processo Processos disponíveis aos quais você pode anexar:

- Nome do processo (.exe)
– Número da ID do processo
- Título da barra de menus
- Tipo (gerenciado v4.0; V2.0 gerenciada, v1.1, v1.0; x86; x64; IA64)
- Nome de usuário (nome da conta)
- Número da sessão
Selecionar um processo ao qual anexar

Selecionar um computador remoto

Alterar o tipo de transporte para se conectar a computadores remotos
Janela Processos Processos anexados:

– Nome do processo
– Número da ID do processo
- Caminho para processar .exe
- Título da barra de menus
- Estado (Quebra. Em execução)
- Depuração (nativa, gerenciada e assim por diante).)
- Tipo de transporte (padrão, nativo sem autenticação)
– Qualificador de transporte (computador remoto)
Ferramentas:

-Anexar
-Destacar
-Terminar

Menu de atalho:

-Anexar
-Destacar
- Desanexar quando a depuração parou
-Terminar
Barra de ferramentas Depurar Local – Processo atual
- Suspender o aplicativo
– Retomar o aplicativo
- Suspender e desligar o aplicativo
– Thread atual
- Alternar o estado do sinalizador de thread atual
- Mostrar apenas threads sinalizados
- Mostrar somente o processo atual
- Quadro de pilha atual
- Alternar para outro processo
- Suspender, retomar ou desligar o aplicativo
- Alternar para outro thread no processo atual
- Alternar para outro quadro de pilha no thread atual
- Sinalizar ou remover threads atuais
- Mostrar apenas threads sinalizados
- Mostrar somente o processo atual
Janela Pilhas Paralelas - Pilhas de chamadas para vários threads em uma janela.
- Quadro de pilha ativo para cada thread.
- Chamadores e callees para qualquer método.
- Detecção de deadlock
– Filtrar threads especificados
– Filtrar pilhas de código externo
- Alternar para o modo de exibição Tarefas
- Sinalizar ou remover um thread
-Zoom
- Copiar quadros de pilha
- Salvar/Exportar todas as pilhas como imagem
Janela Inspeção Paralela - A coluna de sinalizador, na qual você pode marcar um thread ao qual deseja prestar atenção especial.
- A coluna de quadro, na qual uma seta indica o quadro selecionado.
- Uma coluna configurável que pode exibir o computador, o processo, o bloco, a tarefa e o thread.
- Sinalizar ou remover um thread
- Exibir somente threads sinalizados
- Alternar quadros
- Classificar uma coluna
– Agrupar threads
- Congelar ou descongelar threads
– exportar os dados na janela Inspeção Paralela
Janela Threads Threads no processo atual:

- ID do Thread
– ID gerenciada
- Categoria (thread principal, thread de interface, manipulador de chamadas de procedimento remoto ou thread de trabalho)
- Nome do thread
- Local em que o thread é criado
-Prioridade
- Máscara de Afinidade
- Contagem suspensa
– Nome do processo
- Indicador de sinalizador
- Indicador suspenso
Ferramentas:

-Procurar
- Pilha de chamadas de pesquisa
- Sinalizar apenas meu código
- Sinalizar seleção de módulo personalizado
- Agrupar por
-Colunas
- Expandir/Recolher as pilhas de chamadas
- Expandir/Recolher grupos
- Congelar/descongelar threads

Menu de atalho:

- Mostrar threads na origem
- Alternar para um thread
- Congelar um thread em execução
- Descongelar um thread congelado
- Sinalizar um thread para estudo adicional
- Descomplagar um thread
- Renomear um thread
- Mostrar e ocultar threads

Outras ações:

- Exibir a pilha de chamadas para um thread em uma Dica de Dados
Janela de origem Indicadores de thread na sarjeta esquerda indicam threads únicos ou múltiplos (desativados por padrão, ativados usando o menu de atalho na janela Threads ) Menu de atalho:

- Alternar para um thread
- Sinalizar um thread para estudo adicional
- Descomplagar um thread
Janela Tarefas - Exibir informações sobre Task objetos, incluindo ID da tarefa, status da tarefa (agendado, em execução, aguardando, deadlock) e qual thread é atribuído à tarefa.
- Local atual na pilha de chamadas.
– Delegar passado para a tarefa no momento da criação
- Alternar para a tarefa atual
- Sinalizar ou descomprupar uma tarefa
- Congelar ou descongelar uma tarefa
Janela Threads de GPU - A coluna de sinalizador, na qual você pode marcar um thread ao qual deseja prestar atenção especial.
- A coluna de thread atual, na qual uma seta amarela indica o thread atual.
- A coluna Contagem de Threads , que exibe o número de threads no mesmo local.
- A coluna Linha , que exibe a linha de código em que cada grupo de threads está localizado.
- A coluna Endereço , que exibe o endereço de instrução em que cada grupo de threads está localizado.
- A coluna Local , que é o local no código do endereço.
- A coluna Status , que mostra se o thread está ativo ou bloqueado.
- A coluna bloco , que mostra o índice do bloco para os threads na linha.
- Alterar para um thread diferente
- Exibir um bloco e um thread específicos
- Exibir ou ocultar uma coluna
- Classificar por uma coluna
– Agrupar threads
- Congelar ou descongelar threads
- Sinalizar ou remover um thread
- Exibir somente threads sinalizados