Entender o depurador .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ê aprenderá a realizar ambas as tarefas no Visual Studio Code.

Vamos começar aprendendo a 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#.

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

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

Captura de tela do prompt do Visual Studio Code para adicionar os ativos necessários a fim de compilar e depurar 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 abrir um arquivo C# se ainda não tiver feito isso. Se você estiver tendo problemas para criar 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 imediatamente a executar seu código. 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.

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

Se você clicar com o botão direito do mouse para adicionar um ponto de interrupção, 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 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 configuração de um ponto de interrupção condicional no Visual Studio Code.

Visão geral do depurador do Visual Studio Code

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

Captura de tela da visão geral do depurador do Visual Studio Code.

  1. Controles de inicialização do depurador
  2. Estado de variáveis
  3. Estado de variáveis observadas
  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ê 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 launch.json arquivo. 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. 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íveis de todos os lugares em seu programa. Os objetos do sistema do ambiente de execução JavaScript também estão incluídos, portanto, não se surpreenda se você vir muitos elementos lá.
  • Variáveis de fechamento: acessíveis a partir 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.

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

Captura de tela da variável focalizada durante a depuração.

Monitorar variáveis

Pode ser entediante pesquisar um estado variável sempre que você quiser rastreá-lo no tempo ou em funções diferentes. É aí que o painel Monitoramento é útil.

Você pode selecionar o botão Plus 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 assistir.

Todas as expressões no painel de relógio 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ê 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 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 Breakpoints, você pode ver e ativar ou desativar todos os pontos de interrupção colocados em seu código. 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

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

Captura de tela dos controles de execução do depurador do Visual Studio Code.

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.
  • Passo a passo: Executa a próxima instrução de código no contexto atual.
  • Entrar: como Passar por cima, mas se a próxima instrução for uma chamada de função, vá para a primeira instrução de código dessa função (igual ao 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).
  • Reinicie: reinicie seu programa desde o início.
  • Parar: encerrar a execução e sair 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 interno do .NET.

Você pode inserir uma expressão .NET no campo de entrada na parte inferior do console de depuração e 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 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 dados do terminal durante a depuração de código, você pode usar o terminal integrado (uma das janelas do Visual Studio Code) ou um terminal externo. Para este tutorial, você usará o terminal integrado.

  1. Abra .vscode/launch.json.

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

    "console": "internalConsole",
    

    Para:

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

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