Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo mostra como usar diferentes tipos de pontos de interrupção no Visual Studio para melhorar a eficiência de depuração. Ele abrange vários cenários em que os pontos de interrupção podem ser aplicados, como pausar a execução do código, registrar informações e controlar alterações em estados variáveis. O artigo explica como definir pontos de interrupção condicionais, pontos de rastreamento, pontos de interrupção de dados, pontos de interrupção dependentes e pontos de interrupção temporários. Ele também inclui instruções detalhadas sobre como definir pontos de interrupção de função. Este guia é essencial para programadores que procuram utilizar pontos de interrupção para uma depuração eficiente no Visual Studio.
Se você não estiver familiarizado com o uso de pontos de interrupção no Visual Studio, consulte Introdução aos pontos de interrupção antes de passar por este artigo.
Para obter a melhor experiência com esta documentação, escolha sua linguagem de desenvolvimento ou tempo de execução preferido na lista na parte superior do artigo.
Cenários
A tabela a seguir mostra cenários de depuração comuns para pontos de interrupção e o tipo de ponto de interrupção recomendado para o cenário.
| Cenário | Descrição |
|---|---|
| Como faço para pausar o código em execução para inspecionar uma linha de código que pode conter um bug? | Defina um ponto de interrupção. Para obter mais informações, consulte Introdução aos pontos de interrupção. |
| A minha variável tem um valor inesperado? Ou quero inspecionar meu aplicativo quando ele atingir um estado específico? | Tente um ponto de interrupção condicional para controlar onde e quando um ponto de interrupção é ativado usando a lógica condicional. Clique com o botão direito do mouse em um ponto de interrupção para adicionar condições. Defina a condição como verdadeira quando a variável for igual ao valor inesperado. Para obter mais informações, consulte Condições de ponto de interrupção. |
| Como faço para registrar informações na janela Saída em condições configuráveis sem modificar ou parar meu código? | Os tracepoints permitem que registe informações na janela Output em condições configuráveis sem modificar ou interromper o seu código. Para obter mais informações, consulte Usar pontos de rastreamento no depurador do Visual Studio. |
| Como sei quando o valor da minha variável muda? | Para C++, defina um ponto de interrupção de dados . Para aplicativos que usam o .NET Core 3 e posterior, você também pode definir um ponto de interrupção de dados . Caso contrário, apenas para C# e F#, você pode controlar uma ID de objeto com um ponto de interrupção condicional. |
| Como faço para interromper a execução somente se outro ponto de interrupção for atingido? | Defina um ponto de interrupção dependente que interrompa a execução somente se outro ponto de interrupção for atingido pela primeira vez. Para obter mais informações, consulte ponto de interrupção dependente. |
| Posso atingir um ponto de interrupção apenas uma vez? | Defina um ponto de interrupção temporário que permite quebrar o código apenas uma vez. Para obter mais informações, consulte Ponto de Interrupção Temporário. |
| Posso pausar o código dentro de um loop em uma determinada iteração? | Defina um ponto de interrupção dependente que interrompa a execução somente se outro ponto de interrupção for atingido pela primeira vez. Para obter mais informações, consulte Contagem de hits. |
| Posso pausar o código no início de uma função quando sei o nome da função, mas não a sua localização? | Você pode fazer isso com um ponto de interrupção de função. Para obter mais informações, consulte Definir pontos de interrupção de função. |
| Posso pausar o código no início de várias funções com o mesmo nome? | Quando você tem várias funções com o mesmo nome (funções sobrecarregadas ou funções em projetos diferentes), você pode usar um ponto de interrupção de função . |
Ações de ponto de interrupção e pontos de rastreamento
Um ponto de rastreamento é um ponto de interrupção que imprime uma mensagem na janela de Saída . Um tracepoint pode agir como uma instrução de rastreamento temporária na linguagem de programação e não pausa a execução do código. Você cria um ponto de rastreamento definindo uma ação especial na janela Configurações de Ponto de Interrupção . Para obter instruções detalhadas, consulte Utilizar pontos de rastreamento no depurador do Visual Studio.
Condições do ponto de interrupção
Você pode controlar quando e onde um ponto de interrupção será ativado definindo condições. A condição pode ser qualquer expressão válida que o depurador reconheça. (Para obter mais informações sobre Expressões válidas, consulte Expressões no Depurador.)
Para definir uma condição de ponto de interrupção:
Clique com o botão direito do mouse no símbolo de ponto de interrupção e selecione Condições (ou pressione Alt + F9, C). Ou passe o rato sobre o símbolo do ponto de interrupção, selecione o ícone de Configurações e, em seguida, selecione Condições na janela de Configurações do Ponto de Interrupção.
Você também pode clicar com o botão direito do mouse na margem esquerda ao lado de uma linha de código e selecionar Inserir ponto de interrupção condicional no menu de contexto para definir um novo ponto de interrupção condicional.
Também pode definir condições na janela Pontos de interrupção clicando com o botão direito do rato num ponto de interrupção e selecionando Definiçõese, em seguida, selecionando Condições
Na lista suspensa, selecione Expressão Condicional, Contagem de Ocorrênciasou Filtroe defina o valor de acordo.
Selecione Fechar ou pressione Ctrl+Enter para fechar a janela Configurações do ponto de interrupção. Ou, da janela Pontos de interrupção, selecione OK para fechar a caixa de diálogo.
Os pontos de interrupção com condições definidas aparecem com um símbolo de + no código-fonte e nas janelas de Pontos de Interrupção .
Obtenha assistência de IA
Se você tiver o Copilot, poderá obter assistência de IA enquanto cria um ponto de interrupção condicional. O Copilot oferece sugestões para pontos de interrupção condicionais e pontos de rastreamento específicos para seu código.
Para obter um exemplo passo a passo, consulte Depurar com Copilot.
Criar uma expressão condicional
Ao selecionar Expressão Condicional, você pode escolher entre duas condições: É verdadeiro ou Quando alterado. Escolha É verdadeira para interromper quando a expressão estiver satisfeita, ou quando alterada para interromper quando o valor da expressão tiver sido alterado.
No exemplo a seguir, o ponto de interrupção é atingido somente quando o valor de testInt é 4:
No exemplo a seguir, o ponto de interrupção é atingido somente quando o valor de testInt muda:
Se você definir uma condição de ponto de interrupção com sintaxe inválida, uma mensagem de aviso será exibida. Se você especificar uma condição de ponto de interrupção com sintaxe válida, mas semântica inválida, uma mensagem de aviso será exibida na primeira vez que o ponto de interrupção for atingido. Em ambos os casos, o depurador quebra quando atinge o ponto de interrupção inválido. O ponto de interrupção é ignorado apenas se a condição for válida e avaliada como false.
Observação
Para o campo alterado, o depurador não considera a primeira avaliação da condição como uma alteração. Portanto, não atinge o ponto de interrupção na primeira avaliação.
Usar IDs de objeto em expressões condicionais (somente C# e F#)
Há momentos em que você deseja observar o comportamento de um objeto específico. Por exemplo, talvez você queira descobrir por que um objeto foi inserido em uma coleção mais de uma vez. Em C# e F#, você pode criar IDs de objeto para instâncias específicas de tipos de referênciae usá-las em condições de ponto de interrupção. O ID do objeto é gerado pelos serviços de depuração CLR (Common Language Runtime) e associado ao objeto.
Para criar uma ID de objeto:
Defina um ponto de interrupção no código em algum lugar após o objeto ter sido criado.
Inicie a depuração e, quando a execução parar no ponto de interrupção, selecione Depurar>Windows>Locais (ou pressione Ctrl + Alt + V, L) para abrir a janela Locais.
Localize a instância de objeto específica na janela Locais, clique com o botão direito do mouse nela e selecione Criar ID de Objeto.
Você deverá ver um $ mais um número na janela Locais. Este é o ID do objeto.
Adicione um novo ponto de interrupção no ponto que deseja investigar; por exemplo, quando o objeto deve ser adicionado à coleção. Clique com o botão direito do mouse no ponto de interrupção e selecione Condições.
Use o ID do objeto no campo de expressão condicional. Por exemplo, se a variável
itemfor o objeto a ser adicionado à coleção, selecione Is true e digite item == $<n>, onde <n> é o número de identificação do objeto.A execução será interrompida no ponto em que esse objeto deve ser adicionado à coleção.
Para eliminar a ID do Objeto, clique com o botão direito do rato na variável na janela Locais e selecione Eliminar ID do Objeto.
Observação
As IDs de objeto criam referências fracas e não impedem que o objeto seja coletado como lixo. Eles são válidos apenas para a sessão de depuração atual.
Definir uma condição de contagem de visitas
Se você suspeitar que um loop em seu código começa a se comportar incorretamente após um certo número de iterações, você pode definir um ponto de interrupção para interromper a execução após esse número de acertos, em vez de ter que pressionar repetidamente F5 para alcançar essa iteração.
Em Condições na janela Configurações de Ponto de Interrupção, selecione Número de Acertos e, em seguida, especifique o número de iterações. No exemplo a seguir, o ponto de interrupção é definido para atingir todas as outras iterações:
Definir uma condição de filtro
Você pode restringir um ponto de interrupção para disparar somente em dispositivos especificados ou em processos e threads especificados.
Em Condições na janela Configurações do Ponto de Interrupção, selecione Filtro e insira uma ou mais das seguintes expressões:
- MachineName = "nome"
- ProcessId = valor
- ProcessName = "nome"
- ThreadId = valor
- ThreadName = "nome"
Coloque valores de cadeia de caracteres entre aspas duplas. Você pode combinar cláusulas usando & (E), || (OU), ! (NÃO) e parênteses.
Definir pontos de interrupção de função
Você pode interromper a execução quando uma função é chamada. Isso é útil, por exemplo, quando você sabe o nome da função, mas não sua localização. Também é útil se tiveres funções com o mesmo nome e quiseres interromper todas elas (como funções sobrecarregadas ou funções em projetos diferentes).
Para definir um ponto de interrupção de função:
Selecione Depurar>Novo Ponto de Interrupção>Ponto de Interrupção de Funçãoou pressione Ctrl + K, B.
Você também pode selecionar Nova função de ponto de interrupção> na janela de pontos de interrupção .
Na caixa de diálogo Novo Ponto de Interrupção de Função, digite o nome da função na caixa Nome da Função.
Para restringir a especificação da função:
Utilize o nome completo da função.
Exemplo:
Namespace1.ClassX.MethodA()Adicione os tipos de parâmetros de uma função sobrecarregada.
Exemplo:
MethodA(int, string)Use o símbolo '!' para especificar o módulo.
Exemplo:
App1.dll!MethodAUse o operador de contexto em C++ nativo.
{function, , [module]} [+<line offset from start of method>]Exemplo:
{MethodA, , App1.dll}+2
No menu pendente Language, escolha o idioma da função.
Selecione OK.
Definir um ponto de interrupção de função usando um endereço de memória (somente C++ nativo)
Você pode usar o endereço de um objeto para definir um ponto de interrupção de função em um método chamado por uma instância específica de uma classe. Por exemplo, dado um objeto endereçável do tipo my_class, você pode definir um ponto de interrupção de função no método my_method que a instância chama.
Defina um ponto de interrupção em algum lugar depois que a instância da classe for instanciada.
Localize o endereço da instância (por exemplo,
0xcccccccc).Selecione Depurar>Novo Ponto de Interrupção>Ponto de Interrupção de Funçãoou pressione Ctrl + K, B.
Adicione o seguinte à caixa Nome da função e selecione a linguagem C++.
((my_class *) 0xcccccccc)->my_method
Definir pontos de interrupção de dados (.NET Core 3.x ou .NET 5+)
Os pontos de interrupção de dados interrompem a execução quando a propriedade de um objeto específico é alterada.
Para definir um ponto de interrupção de dados:
Em um projeto .NET Core ou .NET 5+, inicie a depuração e aguarde até que um ponto de interrupção seja atingido.
Na janela Autos, Watchou Locals, clique com o botão direito do mouse em uma propriedade e selecione Interromper quando o valor mudar no menu de contexto.
Os pontos de interrupção de dados para .NET Core e .NET 5+ não funcionarão para:
- Propriedades que não são expansíveis na dica de ferramenta, Locals, Autos ou janela de observação
- Variáveis estáticas
- Classes com o atributo DebuggerTypeProxy
- Campos dentro de estruturas
Para obter o número máximo que poderá definir, consulte Limites de hardware de ponto de interrupção de dados.
Definir pontos de interrupção de dados (somente C++ nativo)
Os pontos de interrupção de dados interrompem a execução quando um valor armazenado em um endereço de memória especificado é alterado. Se o valor for lido, mas não alterado, a execução não será interrompida.
Para definir um ponto de interrupção de dados:
Num programa C++, inicie a depuração e aguarde até que um ponto de interrupção seja atingido. No menu Depuração, escolha Novo Ponto de Interrupção>Ponto de Interrupção de Dados.
Você também pode selecionar Novo>Ponto de Interrupção de Dados na janela Pontos de Interrupção ou clicar com o botão direito do mouse num item nas janelas Automáticos, Monitorizar, ou Locais e selecionar Interromper quando o valor mudar no menu de contexto.
Na caixa Endereço, escreva um endereço de memória ou uma expressão que se avalia como um endereço de memória. Por exemplo, digite
&avarpara interromper quando o conteúdo da variávelavarmudar.Na lista suspensa Contagem de Bytes, selecione o número de bytes que pretende que o depurador monitorize. Por exemplo, se selecionar 4, o depurador observará os quatro bytes começando em
&avare interromperá se algum desses bytes mudar de valor.
Os pontos de interrupção de dados não funcionam nas seguintes condições:
- Um processo que não está sendo depurado grava no local da memória.
- O local da memória é compartilhado entre dois ou mais processos.
- O local da memória é atualizado dentro do kernel. Por exemplo, se a memória for transmitida para a função Windows
ReadFilede 32 bits, a memória será atualizada a partir do modo kernel, de modo que o depurador não interromperá a atualização. - Onde a expressão de relógio é superior a 4 bytes em hardware de 32 bits e 8 bytes em hardware de 64 bits. Esta é uma limitação da arquitetura x86.
Observação
Os pontos de interrupção de dados dependem de endereços de memória específicos. O endereço de uma variável muda de uma sessão de depuração para outra, portanto, os pontos de interrupção de dados são automaticamente desativados no final 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 permanecerá habilitado quando a função terminar, mas o endereço de memória não será mais aplicável, portanto, o comportamento do ponto de interrupção será imprevisível. Se você definir um ponto de interrupção de dados em uma variável local, exclua ou desabilite o ponto de interrupção antes que a função termine.
Limites de hardware para pontos de interrupção de dados
O kernel do Windows e o hardware subjacente têm os seguintes limites ao definir pontos de interrupção de dados. O limite refere-se ao número máximo de pontos de interrupção de dados que você pode definir.
| Arquitetura do processador | Limite de ponto de interrupção de dados |
|---|---|
| x64 e x86 | 4 |
| ARM64 | 2 |
| ARM | 1 |
Definir um ponto de interrupção dependente
Os pontos de interrupção dependentes interrompem a execução apenas se outro ponto de interrupção for atingido pela primeira vez. Portanto, em um cenário complexo, como a depuração de um aplicativo multi-threaded, você pode configurar os pontos de interrupção adicionais depois que outro ponto de interrupção for atingido pela primeira vez. Isso pode tornar a depuração de código em caminhos comuns, como loop de jogo ou uma API de utilitário, muito mais fácil, porque um ponto de interrupção nessas funções pode ser configurado para habilitar somente se a função for invocada de uma parte específica do seu aplicativo.
Para definir um ponto de interrupção dependente:
Passe o cursor sobre o símbolo do ponto de paragem, escolha o ícone Configurações e selecione Ativar apenas quando o seguinte ponto de paragem for atingido na janela de Configurações do Ponto de Paragem.
Na lista suspensa, selecione o ponto de interrupção de pré-requisito do qual deseja que o seu ponto de interrupção atual dependa.
Escolha Fechar ou pressione Ctrl+Enter para fechar a janela Configurações do ponto de interrupção. Ou, na janela Pontos de interrupção, escolha OK para fechar a caixa de diálogo.
Você também pode usar o menu de contexto do botão direito do mouse para definir o ponto de interrupção dependente.
Clique com o botão direito na margem esquerda ao lado de uma linha de código e selecione Inserir ponto de interrupção dependente no menu de contexto.
DependentBreakpointContext
- Os pontos de interrupção dependentes não funcionam se houver apenas um único ponto de interrupção na sua aplicação.
- Os pontos de interrupção dependentes são transformados em pontos de interrupção de linha normais se o ponto de interrupção prerequisito for excluído.
Definir um ponto de interrupção temporário
Esse ponto de interrupção permite quebrar o código apenas uma vez. Ao depurar, o depurador do Visual Studio só pausa a aplicação em execução uma vez neste ponto de interrupção e, em seguida, remove-o imediatamente logo após ser atingido.
Para definir um ponto de interrupção temporário:
Passe o cursor sobre o símbolo do ponto de interrupção, escolha o ícone de Configurações, e depois selecione Remover ponto de interrupção quando atingido na janela Configurações do ponto de interrupção.
Escolha Fechar ou pressione Ctrl+Enter para fechar a janela Configurações do ponto de interrupção. Ou, na janela Pontos de interrupção, escolha OK para fechar a caixa de diálogo.
Você também pode usar o menu de contexto do botão direito do mouse para definir o ponto de interrupção temporário.
Clique com o botão direito na margem esquerda ao lado de uma linha de código e selecione Inserir ponto de interrupção temporário no menu de contexto.
Ou, simplesmente use o atalho F9 + Shift + Alt, T e defina o ponto de interrupção temporário na linha desejado.