Threads e processos são conceitos relacionados à ciência da computação. Ambos representam sequências de instruções que devem executar em uma ordem específica. Instruções em threads ou processos separados, entretanto, podem ser executados 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ão às vezes 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 de cada vez. A existência de vários threads permite que um processo separe o trabalho a ser executado paralelamente. Em um computador com multiprocessadores, os processos ou threads podem ser executados em processadores diferentes. Isso permite o verdadeiro processamento paralelo.
O processamento paralelo perfeito não é sempre possível. Às vezes os threads devem ser sincronizados. Um thread pode ter que aguardar 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 erro em aplicativos com multithreads. Em alguns casos, os threads podem interromper espera de um recurso que nunca fica disponível. Isso resulta em uma condição chamada deadlock.
O depurador do Visual Studio fornece ferramentas avançadas e mas fáceis de usar para depurar threads e processos.
Ferramentas para depurar threads e processos no Visual Studio
As principais ferramentas para trabalhar com processos no Visual Studio são a caixa de diálogo Anexar ao Processo, a janela de Processos, e a barra de ferramentas Local de Depuração. As ferramentas principais para depurar threads são a janela de Threads, marcadores de thread em janelas de origem, e a barra de ferramentas de Local de Depuração.
As ferramentas principais para depurar aplicativos multissegmentados são Pilhas Paralelas e Tarefas Paralelas, Inspeção Paralela, e as janelas de Threads da GPU.
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ção disponível
Ações que você pode executar
Caixa de diálogo Anexar ao Processo
Processos disponíveis você pode anexar:
Nome do Processo (exe)
Número de identificação de processo
Título da barra de menus
Tipo (v4.0 gerenciado; V2.0 gerenciado, v1.1, v1.0; x86; x64; IA64)
Nome de usuário (nome de conta)
Número da sessão
Selecione um processo anexar.
Selecione um computador remoto
Altere o tipo de transporte para se conectar a computadores remotos
Janela Processos
Processos anexados:
Nome do Processo
Número de identificação de processo
Caminho para processar .exe
Título da barra de menus
Estado (interrupção. em execução)
Depurando (nativo, gerenciado etc.)
Tipo de transporte (padrão, nativo sem autenticação)
Qualificador de transporte (computador remoto)
Ferramentas:
Attach
Detach
Terminate
O menu de atalho:
Attach
Detach
Desanexe quando a depuração for interrompida
Terminate
Janela de Threads
Threads durante o processo atual:
Identificação do Thread
ID gerenciada
Categoria (thread principal, thread de interface, manipulador de chamada de procedimento remoto ou thread de trabalho)
Nome do Thread
Local onde o thread é criado
Prioridade
Máscara de Afinidade
Contagem suspensa
Nome do Processo
Indicador de Sinalização
Indexador suspenso
Ferramentas:
Pesquisar
Pesquisar pilha de chamadas
Sinalizar Apenas Meu Código
Sinalizar Seleção de Módulo Personalizada
Group by
Colunas
Expandir/Recolher pilhas de chamadas
Expandir/Recolher grupos
Congelar/descongelar threads
O menu de atalho:
Mostrar threads na origem
Alternar para um segmento
Congelar um thread em execução
Descongelar um thread congelado
Sinaliza um thread para estudos adicionais
Remover a sinalização de um segmento
Renomear um thread
Exibir e ocultar threads
Outras ações:
Exibir a pilha de chamadas para um segmento em um DataTip
Janela de origem
Indexadores de threads na medianiz esquerda indicam um ou vários segmentos (desativado por padrão, ativado usando o menu de atalho na janela Threads)
O menu de atalho:
Alternar para um segmento
Sinaliza um thread para estudos adicionais
Remover a sinalização de um segmento
Barra de ferramentas Local de Depuração
Processo atual
Mostrar a miniatura do aplicativo
Suspenda o aplicativo
Retomar o aplicativo
Suspenda e feche o aplicativo
Thread atual
Alterne o estado atual do sinalizador do segmento
Mostrar somente threads sinalizados
Mostrar o só o processo atual
Quadro de pilha atual
Alternar para outro processo
Suspenda, retome ou feche o aplicativo
Alterne para outro thread no processo atual
Alterne para outro quadro de pilha no thread atual
Sinalizar ou remover sinalização de threads atuais
Mostrar somente threads sinalizados
Mostrar somente o processo atual
Janela de Pilhas Paralelas
Pilhas de chamadas para vários threads em uma janela.
Quadro de pilha ativo para cada segmento.
Chamadores e receptores de qualquer método.
Remover threads especificados
Alterne para modo de exibição de Tarefas paralelas
Sinalizar ou remover sinalização de um thread
Aplicar zoom
Janela Tarefas Paralelas
Exibir informações sobre os objetos de Task, incluindo ID de tarefa, status de tarefa (agendada, executando, em espera, em deadlock), e qual segmento está atribuído à tarefa.
Local atual na pilha de chamadas.
O delegado passado para a tarefa no horário de criação
Alterne para a tarefa atual
Sinalizar ou remover sinalização de uma tarefa
Congelar ou descongelar uma tarefa
Janela Inspeção Paralela window
A coluna do sinalizador, na qual você pode marcar um thread ao qual deseja prestar atenção especial.
A coluna do 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 sinalização de um thread
Exibir somente threads sinalizados
Quadros de opção
Classificar uma coluna
Agrupar threads
Congelar ou descongelar threads
exporte os dados na janela de Inspeção Paralela
Janela Threads da GPU
A coluna do sinalizador, na qual você pode marcar um thread ao qual deseja prestar atenção especial.
A coluna thread ativo, em que uma seta amarela indica um thread ativo. Uma seta indica um thread onde a execução interrompe no depurador.
A coluna Contagem de Threads, que exibe o número de segmentos no mesmo local.
A coluna de Linha, que exibe a linha de código onde cada grupo de segmentos está localizado.
A coluna de Endereço, que exibe o endereço da instrução onde 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 segmento está ativo ou bloqueado.
A coluna Lado a lado, que mostra o índice lado a lado para os segmentos na linha.