Compartilhar via


Pontos de interrupção: usar contagens de ocorrências, funções da pilha de chamadas e condições para interromper quando e onde você quiser no Depurador do Microsoft Visual Studio

Definir pontos de interrupção para linhas de origem, instruções de assembly e função de pilha de chamadas.Especificar condições, contagens de ocorrências e local de execução.Imprimir com tracepoints.Salvar e importar pontos de interrupção.

Conteúdo

Criar pontos de interrupção que param quando você deseja

Definir um ponto de interrupção em uma linha de fonte, uma instrução de assembly ou uma função de pilha de chamadas

Acessar a funcionalidade avançada dos pontos de interrupção

Especificar quando um ponto de interrupção ocorre por contagem de ocorrências, avaliação de expressões, local de execução ou alteração de dados

Imprimir na Janela de Saída com tracepoints

Gerenciar pontos de interrupção na Janela de Pontos de Interrupção

Solucionar problemas de pontos de interrupção

Referência de glifos de interrupção

Criar pontos de interrupção que param quando você deseja

Os pontos de interrupção padrão, que param a execução do depurador sempre que um arquivo de origem é atingido, são uma das técnicas de depuração mais importantes da caixa de ferramentas de um desenvolvedor.O Visual Studio ajuda você a ir além dos pontos de interrupção padrão para criar controle mais apurado sobre quando e onde um ponto de interrupção é executado.

  • Você pode definir pontos de interrupção em tempo de execução que paralisam a execução quando o programa retorna a uma função na pilha de chamadas e evitam longa uma série de comandos Depuração Circular.

  • Se você suspeita que um loop no seu código apresenta comportamento incorreto após um determinado número de iterações, poderá definir um ponto de interrupção para paralisar a execução após um número especificado de acertos da linha de código associada, em vez de ser forçado a pressionar repetidamente F5 (Depurar, Continuar) para atingir o nível de iteração.

  • Usando expressões de código, você pode especificar as condições exatas nas quais um ponto de interrupção é executado.

Você pode usar a janela Pontos de Interrupção para gerenciar o estado e o comportamento de um grande número de pontos de interrupção.Se você construiu cuidadosamente uma sequência de pontos de interrupção para diagnosticar um problema comum ou particularmente complexo, poderá salvar ou compartilhar esses pontos de interrupção usando comandos de importação e de exportação da janela Pontos de Interrupção.

Observação de cuidadoCuidado

Evite definir pontos de interrupção em componentes do sistema quando você estiver depurando código de modo misto (nativo e gerenciado).A definição de um ponto de interrupção em um componente do sistema durante a depuração de modo misto pode fazer com que o Common Language Runtime seja interrompido e o depurador pare de responder.

Definir um ponto de interrupção em uma linha de fonte, uma instrução de assembly ou uma função de pilha de chamadas

  • Definir um ponto de interrupção em um arquivo de origem • Definir um ponto de interrupção em um retorno de função na janela Pilha de Chamadas • Definir um ponto de interrupção em uma instrução de assembly na janela Desmontagem

Definir um ponto de interrupção em um arquivo de origem

Estas são duas técnicas para definir um ponto de interrupção padrão em uma janela de origem:

  • Clique duas vezes na medianiz da janela na linha em que você deseja criar a interrupção.

    -ou-

  • Selecione a linha e escolha F9.

Ponto de interrupção na janela pilha de chamadas

O ícone de ponto de interrupção aparece na medianiz.

Visualmente rastreamento pontos de interrupção durante a execução de código, consulte Mapear métodos na pilha de chamadas ao depurar no Visual Studio.

Voltar ao inícioDefinir um ponto de interrupção em uma linha de fonte, uma instrução de assembly ou uma função de pilha de chamadas

Definir um ponto de interrupção em um retorno de função na janela Pilha de Chamadas

Você pode interromper a execução na instrução ou na linha que uma função de chamada retorna, definindo um ponto de interrupção na janela Pilha de Chamadas.O depurador deve estar no modo de interrupção.

  • Abra a janela Pilha de Chamadas (tecla de atalho: Ctrl + Alt + C) e selecione a função de chamada na qual deseja interromper.

  • Escolha Ponto de Interrupção, Inserir Ponto de Interrupção no menu de contexto ou simplesmente use a tecla de atalho: F9.

Um símbolo de ponto de interrupção aparece na margem esquerda ao lado do nome da chamada de função.

Ponto de interrupção na janela pilha de chamadas

Se você abrir a janela Pontos de Interrupção (tecla de atalho: Ctrl + Alt + B), o ponto de interrupção aparecerá como um ponto de interrupção de endereço com um local de memória que corresponde à próxima instrução executável na função.O depurador interrompe a execução na instrução.

Ponto de interrupção de pilha de chamadas na janela pontos de interrupção

Visualmente rastreamento pontos de interrupção durante a execução de código, consulte Mapear métodos na pilha de chamadas ao depurar no Visual Studio.

Definir um ponto de interrupção em uma instrução de assembly na janela Desmontagem

Para definir um ponto de interrupção em uma instrução de assembly, o depurador deve estar no modo de interrupção.

  1. Abra a janela Desmontagem (tecla de atalho: Ctrl + Alt + D).

  2. Siga um destes procedimentos:

    1. Clique duas vezes na medianiz da janela na linha em que você deseja criar a interrupção.

      -ou-

    2. Selecione a linha e escolha F9.

Voltar ao inícioDefinir um ponto de interrupção em uma linha de fonte, uma instrução de assembly ou uma função de pilha de chamadas

Acessar a funcionalidade avançada dos pontos de interrupção

Menu de contexto do ponto de interrupção

Em uma janela de origem, na janela Pilha de Chamadas ou na janela Desmontagem, abra o menu de contexto do ponto de interrupção e escolha a propriedade.

Na janela Pontos de Interrupção, selecione uma linha de ponto de interrupção e abra o menu de contexto.Você também pode definir algumas condições diretamente na coluna da condição.

Especificar quando um ponto de interrupção ocorre por contagem de ocorrências, avaliação de expressões, local de execução ou alteração de dados

  • Especificar uma contagem de ocorrências na qual o ponto de interrupção é executado • Especificar uma condição de ponto de interrupção usando uma expressão de código • Especificar os dispositivos, os processos ou os threads nos quais um ponto de interrupção é executado • Definir um ponto de interrupção de alteração de dados (somente C++ nativo)

Especificar uma contagem de ocorrências na qual o ponto de interrupção é executado

Uma contagem de acertos mantém o registro de quantas vezes um ponto de interrupção é atingido.Você define um valor e uma condição de modo que o ponto de interrupção seja executado quando a contagem de ocorrências for igual ao valor, igual a um múltiplo de um valor especificado ou maior ou igual ao valor.Para especificar a contagem de ocorrências e a condição:

  1. Abra o ponto de interrupção de contagem de ocorrências caixa de diálogo.

    1. Em uma origem, Desmontagem ou Pilha de Chamadas, selecione uma linha que contenha um ponto de interrupção e escolha Pontos de Interrupção, Contagem de Ocorrências no menu de contexto.

      -ou-

    2. Na janela Pontos de Interrupção, selecione uma linha de ponto de interrupção e escolha Contagem de Ocorrências no menu de contexto.

      Caixa de diálogo de contagem de ocorrências de ponto de interrupção

  2. Selecione a condição e insira a contagem de ocorrências.

As condições de contagem de ocorrências são úteis quando você deseja interromper um loop em um determinado número de iterações.Você também poderá especificar um número grande se desejar contar o número de vezes em que um ponto de interrupção é atingido, mas não quiser interromper a execução.

A contagem de ocorrências especificada é mantida somente para a sessão de depuração.Quando a sessão de depuração terminar, a contagem de ocorrências será redefinida como zero.

Voltar ao inícioEspecificar quando um ponto de interrupção ocorre por contagem de ocorrências, avaliação de expressões, local de execução ou alteração de dados

Especificar uma condição de ponto de interrupção usando uma expressão de código

Uma condição de ponto de interrupção é uma expressão que o depurador avalia quando um ponto de interrupção é alcançado.Se a condição for satisfeita, o depurador interromperá a execução.

A condição pode ser qualquer expressão válida que seja reconhecida pelo depurador.Em um programa bancário, por exemplo, você poderia definir uma condição de ponto de interrupção como balance < 0.Para obter mais informações sobre expressões válidas, consulte Expressões no depurador.

Para especificar uma condição de ponto de interrupção

  1. Abra o menu de contexto do ponto de interrupção e selecione Condição.

  2. Na caixa de diálogo Condição de Ponto de Interrupção, insira uma expressão válida na caixa Condição.

  3. Escolha É verdadeiro se quiser interromper quando a expressão for satisfeita ou escolha Foi alterado se quiser interromper quando o valor da expressão for alterado.

O depurador só avalia a expressão depois que o primeiro ponto de interrupção é alcançado.Se você escolher Foi alterado para código nativo, o depurador não considerará a primeira avaliação da condição como uma alteração, portanto o ponto de interrupção não será atingido na primeira avaliação.Se você escolher Foi alterado para código gerenciado, o ponto de interrupção será atingido na primeira avaliação depois de Foi alterado ser selecionado.

Se você definir uma condição de ponto de interrupção com sintaxe inválida, uma mensagem de aviso aparecerá imediatamente.Se você especificar uma condição de ponto de interrupção com sintaxe válida mas semântica inválida, uma mensagem de aviso aparecerá na primeira vez em que o ponto de interrupção for atingido.Nos dois casos, o depurador interrompe a execução quando o ponto de interrupção inválido é atingido.O ponto de interrupção é ignorado somente se a condição é válida e avaliada como false.

Voltar ao inícioEspecificar quando um ponto de interrupção ocorre por contagem de ocorrências, avaliação de expressões, local de execução ou alteração de dados

Especificar os dispositivos, os processos ou os threads nos quais um ponto de interrupção é executado

  1. Abra o menu de contexto de um ponto de interrupção e selecione Filtrar.

    Caixa de diálogo de filtro de ponto de interrupção

  2. Especifique os critérios de filtragem de acordo com as instruções da caixa de diálogo.

Voltar ao inícioEspecificar quando um ponto de interrupção ocorre por contagem de ocorrências, avaliação de expressões, local de execução ou alteração de dados

Definir um ponto de interrupção de alteração de dados (somente C++ nativo)

Os pontos de interrupção de dados interrompem a execução quando um valor armazenado em um local de memória especificado é gravado.Se o valor for lido mas não gravado, a execução não será interrompida.Para definir pontos de interrupção de dados, o depurador deve estar em modo de interrupção.

  1. No menu Depurar, escolha Novo Ponto de Interrupção, Novo Ponto de Interrupção de Dados.

    -ou-

    No menu da janela Pontos de Interrupção, escolha Novo, Novo Ponto de Interrupção de Dados.

  2. Na caixa Endereço, digite um endereço de memória ou uma expressão que seja avaliada como um endereço de memória.

    Por exemplo, digite &avar para interromper quando o conteúdo da variável avar for alterado.

  3. Na caixa Contagem de Bytes, digite o número de bytes que deseja que o depurador inspecione.

    Por exemplo, se você digitar 4, o depurador examinará os quatro bytes que começam em &myFunction e interromperá se qualquer um desses bytes mudar de valor.

Para definir pontos de interrupção de dados, o depurador deve estar em modo de interrupção.

Pontos de interrupção não funcionam nestas condições:

  • Se um processo que não estiver sendo depurado gravar no local da memória

  • Se o local da memória for compartilhado entre dois ou mais processos.

  • Se o local da memória for atualizado no kernel.Por exemplo, se a memória for passada à função ReadFile do Windows de 32 bits, a memória será atualizada do modo kernel e o depurador não interromperá a gravação na memória.

Os endereços de variáveis mudam de uma sessão de depuração para outra.Por esse motivo, pontos de interrupção de dados são automaticamente desabilitados no fim de cada sessão de depuração.

Se você definir um ponto de interrupção de dados em uma variável local, o ponto de interrupção de dados permanecerá habilitado quando a função terminar.No entanto, o endereço de memória em que ele foi definido não terá mais o mesmo significado.Portanto, os resultados desse ponto de interrupção são imprevisíveis.Se você definir um ponto de interrupção de dados em um variável local, a prática recomendada é remover ou desabilitar o ponto de interrupção antes que a função termine.

O Visual Studio suporta um máximo de quatro pontos de interrupção de dados por solução.

Voltar ao inícioEspecificar quando um ponto de interrupção ocorre por contagem de ocorrências, avaliação de expressões, local de execução ou alteração de dados

Imprimir na Janela de Saída com tracepoints

Tracepoints são formas diferentes de usar os pontos de interrupção.Um tracepoint é um ponto de interrupção que imprime uma mensagem na janela de Saída.Um tracepoint pode funcionar como uma declaração de rastreamento temporária na linguagem de programação.

Para imprimir uma mensagem em um ponto de interrupção existente, abra o menu de contexto do ponto de interrupção e escolha Quando Atingido.

Especifique a mensagem a ser impressa na caixa de diálogo Quando o Ponto de Interrupção for Atingido.

Quando caixa de diálogo ponto de interrupção é atingido.

Especificar a mensagem

Você pode incluir informações de programação na mensagem usando a sintaxe de DebuggerDisplayAttribute (consulte DebuggerDisplayAttribute).Veja alguns exemplos:

  • In function '{$FUNC}', on thread '{$TID}'

  • Used variable: {varName}, function name: {functionName($FUNC)}

Você pode usar qualquer uma das palavras-chave descritas na caixa de diálogo Quando o Ponto de Interrupção for Atingido.Além disso, você pode usar outras duas palavras-chave que não é mostradas na caixa de diálogo:

  1. $TICK Insere a contagem de tiques de CPU atual

  2. $FILEPOS Insere a posição atual do arquivo

Especificar o comportamento do tracepoint

Para interromper a execução quando o tracepoint for atingido, desmarque a caixa de seleção Continuar a Execução.Quando Continuar a Execução é selecionado, a execução não é interrompida.Nos dois casos, a mensagem é impressa.

Desabilitar o tracepoint

Para desabilitar temporariamente o tracepoint, desmarque a caixa de seleção Imprimir uma Mensagem.

Gerenciar pontos de interrupção na Janela de Pontos de Interrupção

  • Exportar e importar pontos de interrupção • Rotular pontos de interrupção

Quase todas as funcionalidades para definir, configurar e gerenciar pontos de interrupção da janela Pontos de Interrupção estão disponíveis nos locais dos pontos de interrupção individuais nas janelas de origem, Pilha de Chamadas e Desmontagem.Mas a janela Pontos de Interrupção oferece um local central para gerenciar todos seus pontos de interrupção, o que pode ser muito útil em uma solução grande ou em um cenário complexo de depuração no qual os pontos de interrupção sejam importantes.Se você precisar salvar ou compartilhar o estado e o local de um conjunto de pontos de interrupção, poderá salvar e importar arquivos de ponto de interrupção somente da janela Pontos de Interrupção.

Voltar ao inícioGerenciar pontos de interrupção na Janela de Pontos de Interrupção

Rotular pontos de interrupção

Os rótulos de ponto de interrupção são usados somente na janela Pontos de Interrupção para filtrar e classificar a lista de pontos de interrupção.Para adicionar um rótulo a um ponto de interrupção, escolha a linha do ponto de interrupção e, em seguida, Rótulo no menu de contexto.

Solucionar problemas de pontos de interrupção

  • o depurador não pode determinar o arquivo de origem para um ponto de interrupção • o depurador não pode localizar a versão correta do arquivo de origem para um ponto de interrupção • pontos de interrupção não funcionam em uma DLL

O depurador não pode determinar o arquivo de origem de um ponto de interrupção

Se dois ou mais arquivos de origem no projeto tiverem o mesmo nome, o depurador poderá ter problemas para determinar em que arquivo o ponto de interrupção está definido.Isso geralmente ocorre se você cria um módulo com o mesmo nome que um componente da biblioteca de Depuração à qual você está vinculando.

Para corrigir esse problema, selecione o ponto de interrupção em uma janela de origem e escolha Local no menu de contexto.

Caixa de diálogo ponto de interrupção

Insira o caminho completo do arquivo correto na caixa Arquivo

Voltar ao início Solucionar problemas de pontos de interrupção

O depurador não pode localizar a versão correta do arquivo de origem de um ponto de interrupção

Se um arquivo de origem tiver sido alterado e se a fonte não corresponder mais ao código que você estiver depurando, o depurador poderá localizar o arquivo de origem que corresponda a um ponto de interrupção, mesmo se o arquivo de origem existir.

  1. Se desejar que o Visual Studio exiba código-fonte que não corresponda à versão que você está depurando, escolha Depurar, Opções e Configurações.Na página Depuração/Geral, desmarque a opção Usar apenas o código-fonte que corresponde exatamente à versão original.

  2. Você também pode associar o ponto de interrupção ao arquivo de origem.Selecione o ponto de interrupção e escolha Local no menu de contexto.Marque Permitir que o código fonte seja diferente da versão original na caixa de diálogo Ponto de Interrupção de Arquivo.

Voltar ao início Solucionar problemas de pontos de interrupção

Os pontos de interrupção não funcionam em uma DLL

Você não pode definir um ponto de interrupção em um arquivo de origem quando o depurador não carregou informações de depuração do módulo no qual o código está localizado.Os sintomas podem incluir mensagens, como o ponto de interrupção não pode ser definido.O glifo de ponto de interrupção Aviso aparece no local do ponto de interrupção.No entanto, esses pontos de interrupção de Aviso tornam-se pontos de interrupção reais quando o código é carregado.

Voltar ao inícioSolucionar problemas de pontos de interrupção

Referência de glifos de interrupção

As janelas de origem e a janela Desmontagem mostram locais de ponto de interrupção exibindo símbolos chamados glifos na margem esquerda.A tabela a seguir descreve esses glifos.

Se você posicionar o mouse em um glifo de ponto de interrupção, uma dica de ponto de interrupção aparecerá com mais informações.Essas informações são bastante úteis para pontos de interrupção de erros e avisos.

Glifo

Descrição

Glifo de depuração 1

Ponto de interrupção normal.O glifo sólido indica que o ponto de interrupção está habilitado.O glifo vazado indica que ele está desabilitado.

Glifo de depuração 2

Ponto de interrupção avançado.Ativo/desabilitado.O sinal de + indica que o ponto de interrupção tem pelo menos um recurso avançado (por exemplo, condição, contagem de ocorrências ou filtro) anexado a ele.

Glifo de depuração 3

Ponto de interrupção mapeado.Ativo/desabilitado.O ponto de interrupção é definido no código ASP/ASP.NET e mapeado para um ponto de interrupção na página HTML correspondente ou definido em um arquivo de script do lado do servidor e mapeado para o arquivo de script correspondente do lado do cliente.

Glifo de depuração 4

Tracepoint.Ativo/desabilitado.Atingir este ponto executa uma ação especificada, mas não interrompe a execução do programa.

Glifo de depuração 5

Tracepoint avançado.Ativo/desabilitado.O sinal de + indica que o tracepoint tem pelo menos um recurso avançado (por exemplo, condição, contagem de ocorrências ou filtro) anexado a ele.

Glifo de depuração 6

Tracepoint mapeado.Ativo/desabilitado.O tracepoint é definido no código ASP/ASP.NET e mapeado para um tracepoint na página HTML correspondente.

Glifo de depuração 7

Erro de ponto de interrupção ou de tracepoint.O X indica que o ponto de interrupção ou o tracepoint não pode ser definido devido a uma condição de erro.

Glifo de depuração 8

Aviso de ponto de interrupção ou de tracepoint.O sinal de exclamação indica que um ponto de interrupção ou um tracepoint não pode ser definido devido a uma condição temporária.Geralmente, isso significa que o código no ponto de interrupção ou no local de tracepoint não foi carregado.Também pode ser visto se você anexar a um processo e os símbolos desse processo não forem carregados.Quando o código ou os símbolos são carregados, o ponto de interrupção é habilitado e o glifo se altera.

Consulte também

Conceitos

Iniciar, interromper, avançar, executar código e parar depuração no Visual Studio