Compreender o depurador .NET no Visual Studio Code

Concluído

Na unidade anterior, você aprendeu que um depurador ajuda você a controlar a execução do seu programa e observar seu estado. Nesta seção, você aprenderá como fazer essas duas tarefas no Visual Studio Code.

Vamos começar aprendendo como configurar o depurador de código do Visual Studio para usá-lo com o .NET.

Configurar o Visual Studio Code para depuração do .NET

Na primeira vez que você abrir um arquivo C# no Visual Studio Code, você receberá uma solicitação para instalar extensões recomendadas para C#.

Captura de tela do prompt do Visual Studio Code para instalar a extensão C#.

O Visual Studio Code instalará a extensão C# e mostrará um prompt adicional para adicionar os ativos necessários para compilar e depurar o seu projeto.

Captura de ecrã do Visual Studio Code prompt para adicionar os recursos necessários para compilar e depurar o seu projeto .NET.

Observação

O suporte à linguagem C# no Visual Studio Code é uma instalação opcional do Marketplace. O Visual Studio Code solicita automaticamente que você instale essa extensão quando você abre um arquivo C#, se ainda não o fez. Se você estiver tendo problemas para criar ou depurar seu aplicativo .NET no Visual Studio Code, deve verificar se seu projeto tem os ativos necessários para suporte à linguagem C#.

Pontos de interrupção

Como você aprendeu na unidade anterior, um depurador ajuda você a analisar e controlar a execução do seu programa. Quando você inicia o depurador de código do Visual Studio, ele imediatamente começa a executar seu código. Como seu código é executado rapidamente, você precisa ser capaz de pausar o programa em qualquer instrução. Você usará os pontos de interrupção para fazer isso.

Você pode adicionar um ponto de interrupção no Visual Studio Code clicando no lado esquerdo do número da linha na linha que você deseja quebrar. Você verá um círculo vermelho depois que o ponto de interrupção estiver ativado. Para removê-lo, selecione o círculo vermelho novamente.

Captura de tela de um ponto de interrupção adicionado na janela do editor de código do Visual Studio.

Se clicar com o botão direito do rato para adicionar um ponto de interrupção, também pode selecionar Adicionar Ponto de Interrupção Condicional. Esse tipo especial de ponto de interrupção permite que você insira uma condição para interromper a execução. Esse ponto de interrupção só estará ativo quando a condição especificada for atendida. Você também pode modificar um ponto de interrupção existente clicando com o botão direito do mouse nele e selecionando Editar ponto de interrupção.

Captura de tela da definição de um ponto de interrupção condicional no Visual Studio Code.

Visão geral do depurador de código do Visual Studio

Depois de configurar os pontos de interrupção e iniciar o aplicativo, novos painéis de informações e controles aparecem na tela.

Captura de tela da visão geral do depurador de código do Visual Studio.

  1. Controles de inicialização do depurador
  2. Estado das variáveis
  3. Estado das variáveis monitoradas
  4. Pilha de chamadas atual
  5. Pontos de interrupção
  6. Controlos de execução
  7. Etapa de execução atual
  8. Console de depuração

Controles de inicialização do depurador

Na parte superior da barra lateral, você pode encontrar os controles de inicialização:

Captura de tela dos controles da barra lateral de depuração do Visual Studio Code.

  1. Inicie a depuração.
  2. Selecione a configuração de inicialização ativa.
  3. Edite o arquivo launch.json. Crie-o se precisar.
  4. Abra o terminal de depuração.

Ver e editar o estado das variáveis

Quando você analisa a causa de um defeito do programa, observe o estado de suas variáveis para procurar alterações inesperadas. Você pode usar o painel Variáveis para fazer isso.

Suas variáveis são mostradas organizadas por escopo:

  • Variáveis locais: Acessíveis no escopo atual, geralmente a função atual.
  • Variáveis globais: Acessível a partir de qualquer lugar no seu programa. Os objetos de sistema do runtime do JavaScript também estão incluídos, por isso, não se surpreenda se vir muitas coisas lá.
  • Variáveis de encerramento: Acessível a partir do encerramento atual, se for caso disso. Um fechamento combina o escopo local de uma função com o escopo da função externa à qual pertence.

Você pode desdobrar escopos e variáveis selecionando a seta. Ao desdobrar objetos, você pode ver todas as propriedades definidas no objeto.

É possível alterar o valor de uma variável em tempo real clicando duas vezes na variável.

Ao passar o mouse sobre um parâmetro de função ou uma variável diretamente na janela do editor, você também pode espiar seu valor.

Captura de tela do foco variável durante a depuração.

Observar variáveis

Pode ser tedioso procurar por um estado variável toda vez que você quiser rastreá-lo através do tempo ou de diferentes funções. É aí que o painel Watch é útil.

Você pode selecionar o botão Plus para inserir um nome de variável ou uma expressão para monitorizar. Como alternativa, você pode clicar com o botão direito do mouse em uma variável no painel Variáveis e selecionar Adicionar para assistir.

Todas as expressões dentro do painel de observação são atualizadas automaticamente à medida que o código é executado.

Pilha de chamadas

Sempre que o programa entra numa função, é adicionada uma entrada à pilha de chamadas. Quando a sua aplicação se torna complexa e tem funções chamadas dentro de funções muitas vezes, a pilha de chamadas representa o rastro das chamadas de funções.

É útil encontrar a fonte de uma exceção. Se você tiver uma falha inesperada em seu programa, muitas vezes verá algo no console, como o exemplo a seguir:

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at OrderProcessor.OrderQueue.ProcessNewOrders(String[] orderIds) in C:\Users\Repos\OrderProcessor\OrderQueue.cs:line 12
   at OrderProcessor.Program.Main(String[] args) in C:\Users\Repos\OrderProcessor\Program.cs:line 9

O grupo de linhas de at [...] sob a mensagem de erro é chamado de stack trace. O rastreamento de pilha dá o nome e a origem de cada função que foi chamada antes de terminar com a exceção. Pode ser um pouco difícil de decifrar, porque também inclui funções internas do tempo de execução do .NET.

É aí que o painel de pilha de chamadas do Visual Studio Code é útil. Ele filtra informações indesejadas para mostrar apenas as funções relevantes do seu próprio código por padrão. Em seguida, você pode desenrolar essa pilha de chamadas para descobrir de onde a exceção se originou.

Painel Pontos de interrupção

No painel Pontos de interrupção, pode ver e alternar todos os pontos de interrupção colocados no seu código. Você também pode ativar/desativar opções para interromper exceções capturadas ou não capturadas. Você pode usar o painel Pontos de interrupção do para examinar o estado do programa e rastrear a origem de uma exceção usando a pilha de chamadas quando ocorrer.

Controlar a execução

Você pode controlar o fluxo de execução do seu programa usando esses controles.

Captura de tela dos controles de execução do depurador de código do Visual Studio.

Da esquerda para a direita, os controles são:

  • Continuar ou pausar a execução: Se a execução for pausada, ela continuará até que o próximo ponto de interrupção seja atingido. Se o programa estiver em execução, o botão alterna para um botão de pausa que você pode usar para pausar a execução.
  • Step over: Executa a próxima instrução de código no contexto atual.
  • Entrar em: Semelhante a Avançar por cima, mas se a próxima instrução for uma chamada de função, avança para a primeira instrução de código dessa função (tal como o comando step).
  • Saia: Se você estiver dentro de uma função, execute o código restante dessa função e volte para a instrução após a chamada de função inicial (igual ao comando out).
  • Reiniciar: Reinicie o programa desde o início.
  • Stop: Termine a execução e saia do depurador.

Usar o console de depuração

Você pode mostrar ou ocultar o console de depuração selecionando Ctrl+Shift+Y para Windows e Linux. Selecione Cmd+Shift+Y para Mac. Você pode usar o console de depuração para visualizar os logs do console do aplicativo. Você também pode usá-lo para avaliar expressões ou executar código no conteúdo de execução atual, como comandos ou nomes de variáveis no depurador .NET interno.

Você pode inserir uma expressão .NET no campo de entrada na parte inferior do console de depuração e, em seguida, selecionar Enter para avaliá-la. O resultado é exibido diretamente no console.

Captura de tela do console de depuração do Visual Studio Code.

Usando o console de depuração, você pode verificar rapidamente um valor de variável, testar uma função com valores diferentes ou alterar o estado atual.

Observação

Embora o console de depuração seja muito útil para executar e avaliar o código .NET, ele pode ser um pouco confuso quando você está tentando executar ou depurar um aplicativo do Console .NET porque o console de depuração não aceita entrada de terminal para um programa em execução.

Para manipular a entrada do terminal durante a depuração, você pode usar o terminal integrado (uma das janelas do Visual Studio Code) ou um terminal externo. Para este tutorial, você usa o terminal integrado.

  1. Abra .vscode/launch.json.

  2. Altere a configuração de console para integratedTerminal de:

    "console": "internalConsole",
    

    Para:

    "console": "integratedTerminal",
    
  3. Salve suas alterações.

Na próxima unidade, você aprenderá como usar o depurador para corrigir o bug no código de Fibonacci que vimos anteriormente.