Depurar com o Visual Studio Code

Concluído

No exercício anterior, você aprendeu a importância de poder executar seu código passo a passo com o depurador fornecido em Node.js. Para o seu trabalho no aplicativo Tailwind Traders, você precisará de um ambiente de depuração mais abrangente dentro do seu IDE (Integrated Development Environment).

Vamos descobrir como pode configurar o depurador do Visual Studio Code para o utilizar com o Node.js.

Como usar o Visual Studio Code for Node.js depuração

No Visual Studio Code, o depurador é acessado a partir da guia Executar .

Screenshot of Visual Studio Code debug tab.

  • Se você tiver um .js arquivo aberto na janela do editor, poderá selecionar Executar e Depurar e, em seguida, selecionar Nó.js para depurar diretamente o arquivo JavaScript aberto.

    Screenshot of Node.js environment selection drop-down list in Visual Studio Code.

Há várias outras maneiras de iniciar a depuração no Visual Studio Code. Para o próximo exercício, usaremos um arquivo launch.json. As equipes de desenvolvimento geralmente usam um arquivo launch.json para personalizar a configuração de execução. Com a configuração especificada em um arquivo .json, você pode verificá-la no controle do código-fonte. A partir do controle do código-fonte, você pode compartilhar a configuração em toda a sua equipe.

Controle o fluxo adicionando pontos de interrupção

Ao contrário do depurador de linha de comando Node.js interno, o depurador de código do Visual Studio inicia imediatamente a execução do código. Se o seu programa terminar rapidamente, você pode não ter a chance de interagir com o depurador. É por isso que você pode querer adicionar pontos de interrupção antes de executar o código. Vamos adicionar e remover alguns pontos de interrupção no próximo exercício.

Para adicionar um ponto de interrupção em seu código, localize a linha de código em seu arquivo JavaScript (.js) onde você deseja adicionar uma quebra. Ao lado do número da linha da instrução de código, selecione na margem esquerda. Quando o ponto de interrupção for adicionado, você verá um círculo vermelho ao lado do número da linha. Para remover o ponto de interrupção, selecione o círculo vermelho.

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

Você também pode usar o menu de contexto do botão direito do mouse para adicionar um ponto de interrupção. O menu de conteúdo inclui a opção Adicionar ponto de interrupção condicional, onde você insere uma condição para interromper a execução do código. Um ponto de interrupção condicional só fica ativo quando a condição especificada é atendida.

Screenshot of setting a conditional breakpoint in Visual Studio Code.

Esse ponto de interrupção interrompe a execução somente quando o valor de convertedValue é indefinido.

Descrição geral do depurador do Visual Studio Code

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

Screenshot of Visual Studio Code debugger overview.

Número Nome Descrição
1. Controlos de início do depurador Na parte superior da barra lateral, você pode encontrar os controles de inicialização.
2. Estado das variáveis O painel Variáveis mostra o estado atual das variáveis.
3. Estado das variáveis vistas O painel Inspeção mostra o estado atual das variáveis observadas.
4. Pilha de chamadas atual O painel Pilha de chamadas mostra a pilha de chamadas atual.
5. Ficheiros de script carregados O painel Arquivos de script carregados mostra os arquivos JavaScript que foram carregados até agora.
6. Pontos de interrupção O painel Pontos de interrupção mostra todos os pontos de interrupção colocados no código.
7. Controlos de execução Pode controlar o fluxo da execução do seu programa com estes controlos.
8. Passo de execução atual A etapa de execução atual é realçada na janela do editor.
9. Consola de depuração O Debug Console pode ser usado para visualizar os logs do console do aplicativo e para avaliar expressões ou executar código no contexto de execução atual.

Controlos de início do depurador

Na parte superior da barra lateral, pode ver os controlos de início:

Screenshot of Visual Studio Code debug sidebar controls.

Número Nome Descrição
1. Iniciar depuração Comece a depurar seu aplicativo.
2. Selecione a configuração de inicialização ativa Selecionar a configuração de início ativa.
3. Editar o launch.json ficheiro Editar o ficheiro launch.json. Crie o arquivo json se precisar.
4. Abra o Console de Depuração Abra o Console de Depuração e alterne a visibilidade dos painéis Variáveis, Observação, Pilha de chamadas e Pontos de interrupção.

Ver e editar o estado das suas variáveis

Ao analisar a causa de um defeito do programa, um dos aspetos mais importantes é estar atento ao estado das suas variáveis para detetar alterações inesperadas. Pode utilizar o painel Variables (Variáveis) para tal.

As suas variáveis são apresentadas organizadas por âmbito:

Scope Description
Local Local variables (Variáveis locais) são as acessíveis no âmbito atual, normalmente a função atual.
Global Global variables (Variáveis globais) são as acessíveis a partir de qualquer local no seu programa. Também inclui os objetos do sistema do runtime JavaScript, por isso é natural que tenha muitos conteúdos.
Encerramento Closure variables (Variáveis de fecho) são as acessíveis a partir do fecho atual, se existir. Um fecho combina o âmbito local de uma função com o âmbito da função externa a que pertence.

As ações possíveis incluem:

  • Desdobrar escopos: Você pode desdobrar escopos e variáveis selecionando a seta. Ao desdobrar objetos, pode ver todas as propriedades definidas neste objeto.

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

  • Espreitar uma variável: Ao passar o rato sobre um parâmetro de função ou uma variável diretamente na janela do editor, também pode espreitar o seu valor.

    Screenshot of variable hover during debugging.

Ver variáveis

Se quiser controlar o estado de uma variável ao longo do tempo ou funções diferentes, pode tornar-se aborrecido estar sempre a procurar. É nestas situações que o painel Watch (Ver) é útil.

Screenshot of watched variables.

Pode selecionar o botão mais para introduzir o nome de uma variável ou uma expressão para ver. Como alternativa, você pode clicar com o botão direito do mouse em uma variável no painel Variáveis e selecionar Adicionar para observação.

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

Pilha de chamadas

Sempre que o seu programa introduz uma função, é adicionada uma entrada à pilha de chamadas. Quando seu aplicativo se torna complexo e você tem funções chamadas dentro de funções muitas vezes, a pilha de chamadas representa a trilha de chamadas de funções.

É útil para localizar a origem de uma exceção. Muitas vezes, se tiver uma falha inesperada no seu programa, verá algo com este aspeto na consola:

/Users/learn/nodejs/index.js:22
  return value.toFixed(2);
               ^
TypeError: Cannot read property 'toFixed' of undefined
    at formatValueForDisplay (/Users/learn/nodejs/index.js:22:16)
    at printForeignValues (/Users/learn/nodejs/index.js:31:28)
    at Object.<anonymous> (/Users/learn/nodejs/index.js:39:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11

O grupo de linhas at [...] por baixo da mensagem de erro é denominado rastreio de pilha. O rastreio de pilha indica o nome e origem de todas as funções chamadas antes de acabar com a exceção. No entanto, pode ser complicado de decifrar, uma vez que inclui funções internas do runtime Node.js.

É nesta situação que o painel Call stack (Pilha de chamadas) do Visual Studio Code é útil. Este filtra as informações indesejadas para mostrar apenas as funções relevantes do seu próprio código por predefinição. Em seguida, pode desenrolar esta pilha de chamadas para descobrir onde é que a exceção teve origem.

Para o ajudar ainda mais, pode selecionar o botão Restart frame (Reiniciar frame) que aparece ao pairar o cursor sobre o nome de uma função na pilha. Ele irá retroceder a execução de volta para o início dessa função, realmente reiniciando o programa até esse ponto.

Screenshot of the Restart frame button in the Visual Studio Code call stack panel.

Ver ficheiros de script carregados

Este painel apresenta todos os ficheiros JavaScript que foram carregados até agora. Em projetos grandes, por vezes pode ser útil verificar de que ficheiro é o código a ser executado atualmente.

Pontos de interrupção

No painel Breakpoints (Pontos de interrupção), pode ver e ativar/desativar todos os pontos de interrupção que colocou no seu código. Além disso, pode ativar/desativar opções para interromper em exceções identificadas e não identificadas. Você pode usar o painel Pontos de interrupção 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

Pode controlar o fluxo da execução do seu programa com estes controlos.

Screenshot of Visual Studio Code debugger execution controls.

Da esquerda para a direita, são estes os controlos:

  • Continuar ou colocar em pausa a execução. Se a execução estiver em pausa, irá continuar até o próximo ponto de interrupção ser alcançado. Se o seu programa estiver em execução, o botão muda para um botão de pausa que pode utilizar para colocar a execução em pausa.
  • Ignorar. Executa a instrução de código seguinte no contexto atual (como o comando next no depurador incorporado).
  • Avançar. Como Ignorar, mas se a instrução seguinte for uma chamada de função, avança para a primeira instrução de código nesta função (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 out comando).
  • Reiniciar. Reinicie o seu programa a partir do início.
  • Parar. Termine a execução e saia do depurador.

Utilizar a consola de depuração

O console de depuração pode ser mostrado ou oculto pressionando Ctrl+Shift+Y (Windows, Linux) ou Cmd+Shift+Y (Mac). Ele pode ser usado para visualizar os logs do console do aplicativo e para avaliar expressões ou executar código no conteúdo de execução atual, como o exec comando no depurador Node.js interno.

Pode introduzir uma expressão JavaScript no campo de texto na parte inferior da consola de depuração. Em seguida, pressione Enter para avaliá-lo. O resultado é apresentado diretamente na consola.

Screenshot of Debug console.

Desta forma, pode verificar o valor de uma variável, testar uma função com valores diferentes ou alterar o estado atual rapidamente.

Adicione pontos de log em vez de console.log

Linters sinalizará console.log instruções como erros. Para obter o mesmo efeito console.log que as instruções, use pontos de log do Visual Studio Code, que são impressos no console de Depuração.

Adicione um ponto de registo clicando com o botão direito do rato na mesma área que utilizou para adicionar um ponto de interrupção e, em seguida, selecione Adicionar ponto de registo. Introduza uma mensagem para ser apresentada nesse ponto no seu código.

Screenshot of adding a logpoint in Visual Studio Code.

Como os pontos de interrupção, os pontos de log não alteram seu código de forma alguma e são usados apenas durante a depuração. Já não tem desculpa para deixar que esse console.log('here') esquecido passe para a produção.