Noções básicas sobre o depurador do .NET no Visual Studio Code

Concluído

Na unidade anterior, você viu que um depurador ajuda a controlar a execução do programa e observar seu estado. Nesta seção, você verá como fazer tudo isso no Visual Studio Code.

Para começar, vejamos como configurar o depurador do Visual Studio Code para usá-lo com o .NET.

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

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

Screenshot of Visual Studio Code prompt to install the C# extension.

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

Screenshot of Visual Studio Code prompt to add required assets to build and debug your .NET project.

Observação

O suporte à linguagem C# no Visual Studio Code é uma instalação opcional do Marketplace. O Visual Studio Code solicitará automaticamente a instalação dessa extensão quando você abrir um arquivo C#, se ela ainda não estiver instalada. Se você estiver com problemas para compilar ou depurar seu aplicativo .NET no Visual Studio Code, verifique se o projeto tem os ativos necessários para o suporte à linguagem C#.

Pontos de interrupção

Como você viu na unidade anterior, o depurador ajuda a analisar e controlar a execução do programa. Quando você inicia o depurador do Visual Studio Code, ele começa a executar seu código imediatamente. Como o código é executado de modo rápido, você precisa ser capaz de pausar o programa em qualquer instrução. Você usará 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 de linha na linha que deseja interromper. Você verá um círculo vermelho quando o ponto de interrupção estiver habilitado. Para removê-lo, basta clicar no círculo vermelho novamente.

Screenshot of a breakpoint added in the Visual Studio Code editor window.

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

Screenshot of setting a conditional breakpoint in Visual Studio Code.

Visão geral do depurador do Visual Studio Code

Após você configurar os pontos de interrupção e iniciar o aplicativo, novos painéis de informações e controles aparecerão na tela.

Screenshot of Visual Studio Code debugger overview.

  1. Controles de inicialização do depurador
  2. Estado das variáveis
  3. Estado das variáveis inspecionadas
  4. Pilha de chamadas atual
  5. Pontos de interrupção
  6. Controles 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ê encontra os controles de inicialização:

Screenshot of Visual Studio Code debug sidebar controls.

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

Exibir e editar o estado das variáveis

Ao analisar a causa de um defeito de programa, observe o estado das variáveis para procurar alterações inesperadas. Para fazer isso, você pode usar o painel Variáveis.

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

  • As variáveis locais são acessíveis no escopo atual, geralmente na função atual.
  • As variáveis globais são acessíveis de qualquer lugar do programa. Objetos do sistema do runtime do JavaScript também estão incluídos, portanto, não se surpreenda se vir muitas coisas ali.
  • As variáveis de fechamento são acessíveis do fechamento atual, se houver. Um fechamento combina o escopo local de uma função com o escopo da função externa à qual ela pertence.

É possível desdobrar escopos e variáveis selecionando a seta. Ao desdobrar objetos, é possível conferir todas as propriedades definidas neles.

É 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, também é possível conferir o valor deles.

Screenshot of variable hover during debugging.

Inspecionar variáveis

Pode ser entediante pesquisar um estado variável sempre que você quiser rastreá-lo no tempo ou em funções diferentes. Nesse caso, o painel Inspeção é bem útil.

Você pode selecionar o botão Mais para inserir um nome de variável ou uma expressão a ser observado. Como alternativa, você pode clicar com o botão direito do mouse em uma variável no painel Variáveis e selecionar Adicionar para inspeção.

Todas as expressões dentro do painel de inspeção são atualizadas automaticamente conforme o código é executado.

Pilha de chamadas

Toda vez que o programa entra em uma função, uma entrada é adicionada à pilha de chamadas. Quando o aplicativo se torna complexo e você tem funções sendo chamadas dentro de outras funções repetidas vezes, a pilha de chamadas representa a trilha das chamadas de funções.

Ela é útil para localizar a origem de uma exceção. Se você enfrentar uma falha inesperada no programa, geralmente verá algo no console como o seguinte exemplo:

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 at [...] abaixo da mensagem de erro é chamado de rastreamento de pilha. O rastreamento de pilha informa o nome e a origem de cada função chamada antes da exceção. Pode ser um pouco difícil de decifrar, pois também inclui funções internas do runtime do .NET.

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

Painel pontos de interrupção

No painel Pontos de interrupção, você pode ver todos os pontos de interrupção que colocou no código e alternar entre eles. Você também pode alternar entre as opções para interromper em exceções capturadas ou não capturadas. Use o painel Pontos de interrupção para examinar o estado do programa e rastrear a origem de uma exceção, se uma ocorrer, usando a Pilha de chamadas.

Controlar a execução

É possível controlar o fluxo de execução do programa usando esses controles.

Screenshot of Visual Studio Code debugger execution controls.

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 alternará para um botão pausar que você pode usar para pausar a execução.
  • Contornar: Executa a próxima instrução de código no contexto atual.
  • Intervir: Semelhante a Contornar, mas se a próxima instrução for uma chamada de função, siga para a primeira instrução de código dessa função (a mesma que o comando step).
  • Sair: Se você estiver dentro de uma função, execute o código restante dela e volte para a instrução após a chamada de função inicial (o mesmo que o comando out).
  • Reiniciar: Reinicie o programa desde o início.
  • Parar: Encerra a execução e sai do depurador.

Usar o console de depuração

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

É possível inserir uma expressão .NET no campo de entrada na parte inferior do console de depuração e selecione Enter para avaliá-lo. O resultado é exibido diretamente no console.

Screenshot of Visual Studio Code debug console.

Usando o console de depuração, é possível 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 do .NET porque o console de depuração não aceita entrada de terminal para um programa em execução.

Para lidar com a entrada de terminal durante a depuração, você pode usar o terminal integrado (uma das janelas do Visual Studio Code) ou um terminal externo. Neste 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ê verá como usar o depurador para corrigir o bug no código Fibonacci que vimos anteriormente.