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
Create breakpoints that break when you want
Set a breakpoint at a source line, assembly instruction, or call stack function
Access the advanced functionality of breakpoints
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Print to the Output window with tracepoints
Manage breakpoints in the Breakpoints window
Troubleshoot breakpoints
Breakpoint Glyphs Reference
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.
Aviso
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.
Contents
Definir um ponto de interrupção em uma linha de fonte, uma instrução de assembly ou uma função de pilha de chamadas
- Set a breakpoint in a source file • Set a breakpoint at a function return in the Call Stack window • Set a breakpoint at an assembly instruction in the Disassembly window
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.
O ícone de ponto de interrupção aparece na medianiz.
Para rastrear visualmente pontos de interrupção durante a execução de código, consulte Mapear métodos na pilha de chamadas ao depurar no Visual Studio.
Set a breakpoint at a source line, assembly instruction, or call stack function
Contents
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.
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.
Para rastrear visualmente pontos de interrupção durante a execução de código, consulte Mapear métodos na pilha de chamadas ao depurar no Visual Studio.
Set a breakpoint at a source line, assembly instruction, or call stack function
Contents
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.
Abra a janela Desmontagem (tecla de atalho: Ctrl + Alt + D).
Siga um destes procedimentos:
Clique duas vezes na medianiz da janela na linha em que você deseja criar a interrupção.
-ou-
Selecione a linha e escolha F9.
Set a breakpoint at a source line, assembly instruction, or call stack function
Contents
Acessar a funcionalidade avançada dos pontos 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. |
Contents
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
- Specify a hit count at which the breakpoint executes • Specify a breakpoint condition using a code expression • Specify the devices, processes, or threads that a breakpoint executes on • Set a data change breakpoint (native C++ only)
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:
Abra a caixa de diálogo Ponto de Interrupção de Contagem de Ocorrências.
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-
Na janela Pontos de Interrupção, selecione uma linha de ponto de interrupção e escolha Contagem de Ocorrências no menu de contexto.
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.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
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
Abra o menu de contexto do ponto de interrupção e selecione Condição.
Na caixa de diálogo Condição de Ponto de Interrupção, insira uma expressão válida na caixa Condição.
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.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
Especificar os dispositivos, os processos ou os threads nos quais um ponto de interrupção é executado
Abra o menu de contexto de um ponto de interrupção e selecione Filtrar.
Especifique os critérios de filtragem de acordo com as instruções da caixa de diálogo.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
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.
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.
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.
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.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
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.
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 outras palavras-chave que não são mostradas na caixa de diálogo: $TICK insere a contagem em escala de CPU atual, enquanto $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.
Contents
Gerenciar pontos de interrupção na Janela de Pontos de Interrupção
- Export and import breakpoints • Label breakpoints
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.
Manage breakpoints in the Breakpoints window
Contents
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
- The debugger can't determine the source file for a breakpoint • The debugger can't locate the correct version of the source file for a breakpoint • Breakpoints don't work in a 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.
Insira o caminho completo do arquivo correto na caixa Arquivo
Troubleshoot breakpoints
Contents
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.
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.
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.
Troubleshoot breakpoints
Contents
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.
Troubleshoot breakpoints
Contents
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 |
---|---|
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. |
|
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. |
|
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. |
|
Tracepoint. Ativo/desabilitado. Atingir este ponto executa uma ação especificada, mas não interrompe a execução do programa. |
|
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. |
|
Tracepoint mapeado. Ativo/desabilitado. O tracepoint é definido no código ASP/ASP.NET e mapeado para um tracepoint na página HTML correspondente. |
|
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. |
|
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. |
Contents
Consulte também
Conceitos
Iniciar, interromper, avançar, executar código e parar depuração no Visual Studio