Este tutorial ensina os fluxos de trabalho básicos para depuração de qualquer problema de JavaScript no DevTools. Continue lendo ou assista a versão em vídeo deste tutorial.
Reproduza o bug.
Encontrar uma série de ações que reproduzam consistentemente um bug é sempre o primeiro passo para a depuração.
- Abra esta demonstração em uma nova guia.
- Digite
5
na caixa Número 1. - Digite
1
na caixa Número 2. - Clique em Adicionar número 1 e número 2. A etiqueta abaixo do botão informa
5 + 1 = 51
. O resultado será6
. Esse é o bug que você vai corrigir.
Neste exemplo, o resultado de 5 + 1 é 51. Deve ser 6.
Familiarizar-se com a interface do painel Sources
O DevTools fornece muitas ferramentas diferentes para tarefas distintas, como mudança de CSS, criação de perfil de desempenho do carregamento da página e monitoramento de solicitações de rede. O painel Sources é onde você depura o JavaScript.
Abra o DevTools e navegue até o painel Sources.
O painel Origens tem três seções:
- A guia Página com a árvore de arquivos. Todo arquivo solicitado pela página é listado aqui.
- A seção Editor de código. Depois de selecionar um arquivo na guia Page, o conteúdo dele é exibido aqui.
A seção Debugger. Várias ferramentas para inspecionar o JavaScript da página.
Se a janela do DevTools estiver ampliada, o Debugger vai ficar à direita do Code Editor por padrão. Nesse caso, as guias Scope e Watch mesclam Breakpoints, Call stack e outras como seções recolhíveis.
Pausar o código com um ponto de interrupção
Um método comum para depurar problemas desse tipo é inserir várias instruções console.log()
no código, para inspecionar valores durante a execução do script. Exemplo:
function updateLabel() {
var addend1 = getNumber1();
console.log('addend1:', addend1);
var addend2 = getNumber2();
console.log('addend2:', addend2);
var sum = addend1 + addend2;
console.log('sum:', sum);
label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
}
O método console.log()
pode dar conta do trabalho, mas os pontos de interrupção são mais rápidos. Um
ponto de interrupção permite pausar o código no meio da execução e examinar todos os valores naquele
momento. Os pontos de interrupção têm algumas vantagens sobre o método console.log()
:
- Com
console.log()
, você precisa abrir o código-fonte manualmente, encontrar o código relevante, inserir as instruçõesconsole.log()
e recarregar a página para ver as mensagens no console. Com os pontos de interrupção, você pode pausar no código relevante sem mesmo saber como ele está estruturado. - Nas instruções
console.log()
, é necessário especificar explicitamente cada valor que você quer inspecionar. Com os pontos de interrupção, o DevTools mostra os valores de todas as variáveis naquele momento. Às vezes existem variáveis que afetam seu código sem que você perceba.
Resumindo, os pontos de interrupção podem ajudar você a encontrar e corrigir bugs mais rapidamente do que o método console.log()
.
Se você parar e pensar em como o app funciona, vai conseguir supor que a
soma incorreta (5 + 1 = 51
) é calculada no listener de eventos click
associado ao botão
Adicionar número 1 e número 2. Portanto, você provavelmente quer pausar o código próximo ao tempo
em que o listener click
é executado. Os Pontos de interrupção do listener de eventos permitem fazer exatamente isso:
- Na seção Debugger, clique em Event Listener Breakpoints para expandir a seção. O DevTools revela uma lista de categorias de evento expansíveis, como Animation e Clipboard.
- Ao lado da categoria de evento Mouse, clique em Expandir. O DevTools revela uma lista de eventos de mouse, como click e mousedown. Cada evento tem uma caixa de seleção ao lado.
Marque a caixa de seleção click. O DevTools agora está configurado para pausar automaticamente quando qualquer listener de evento
click
for executado.De volta à demonstração, clique novamente em Adicionar número 1 e número 2. O DevTools pausa a demonstração e destaca uma linha de código no painel Sources. O DevTools deve estar pausado nesta linha de código:
function onClick() {
Se você estiver pausado em uma linha de código diferente, pressione
Retomar execução do script até parar na linha correta.
Os Event Listener Breakpoints são apenas um dos vários tipos de pontos de interrupção disponíveis no DevTools. Vale a pena conhecer todos os tipos diferentes, porque cada um deles ajuda você a depurar diferentes cenários da maneira mais rápida possível. Consulte Pausar o código com pontos de interrupção para saber quando e como usar cada tipo.
Percorrer o código
Uma causa comum de bugs é a execução de um script na ordem errada. Percorrer o código permite que você acompanhe a execução dele, uma linha de cada vez, e descubra exatamente onde ele está sendo executado em ordem diferente da esperada. Experimente agora:
No painel Sources do DevTools, clique em
Step into next function call para acompanhar a execução da funçãoonClick()
, uma linha de cada vez. O DevTools destaca esta linha de código:if (inputsAreEmpty()) {
Clique em
Step over next function call.O DevTools executa
inputsAreEmpty()
sem entrar na função para acompanhamento. Observe como o DevTools pula algumas linhas de código. Isso ocorre porqueinputsAreEmpty()
foi avaliado como falso, portanto, o bloco de código da instruçãoif
não foi executado.
Essa é a ideia básica de percorrer o código. Se você observar o código em get-started.js
, vai
notar que o bug provavelmente está em algum lugar da função updateLabel()
. Em vez de acompanhar
cada linha de código, use outro tipo de ponto de interrupção para pausar o código mais perto do local
provável do bug.
Definir um ponto de interrupção de linha de código
Os pontos de interrupção de linha de código são o tipo mais comum de ponto de interrupção. Quando você quiser pausar em uma linha de código específica, use um ponto de interrupção de linha de código:
Confira a última linha de código em
updateLabel()
:label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
À esquerda do código, você pode ver o número da linha dessa linha de código específica, que é 32. Clique em 32. O DevTools coloca um ícone azul acima de 32. Isso significa que há um ponto de interrupção de linha de código nessa linha. O DevTools sempre faz uma pausa antes que essa linha de código seja executada.
Clique em mostra os valores de
Retomar execução do script. O script continua a ser executado até chegar à linha 32. Nas linhas 29, 30 e 31, o DevToolsaddend1
,addend2
esum
in-line ao lado das declarações.
Nesse exemplo, o DevTools pausa no ponto de interrupção da linha de código na linha 32.
Verificar valores de variáveis
Os valores de addend1
, addend2
e sum
parecem suspeitos. Elas estão entre aspas, o que
significa que são strings. Essa é uma boa hipótese para explicar a causa do bug. Agora
é hora de reunir mais informações. O DevTools fornece muitas ferramentas para examinar os valores
de variáveis.
Método 1: inspecionar o escopo
Quando você está pausado em uma linha de código, a guia Escopo mostra quais variáveis locais e globais foram definidas nesse ponto da execução, junto com o valor de cada variável. Ele também mostra variáveis de fechamento, quando aplicável. Quando você não está pausado em uma linha de código, a guia Escopo fica vazia.
Clique duas vezes no valor de uma variável para editá-lo.
Método 2: expressões de monitoramento
A guia Assistir permite monitorar os valores das variáveis ao longo do tempo. O recurso Watch não se limita a variáveis. É possível armazenar qualquer expressão JavaScript válida na guia Watch.
Experimente agora:
- Clique na guia Watch.
- Clique em Adicionar expressão de observação.
- Digite
typeof sum
. - Pressione Enter. O DevTools mostra
typeof sum: "string"
. O valor à direita dos dois pontos é o resultado da expressão.
Esta captura de tela mostra a guia Watch (canto inferior direito) após a criação da expressão de
monitoramento typeof sum
.
Como previsto, sum
está sendo avaliado como string em vez de como número. Você já confirmou que
essa é a causa do bug.
Método 3: o console
Além de visualizar mensagens console.log()
, você também pode usar o Console para avaliar instruções
JavaScript arbitrárias. Com relação às depurações, você pode usar o console para testar possíveis correções
de bugs. Experimente agora:
- Se a gaveta do console não estiver aberta, pressione Esc para abri-la. Ela é aberta na parte de baixo da janela do DevTools.
- No console, digite
parseInt(addend1) + parseInt(addend2)
. Essa instrução funciona porque você está pausado em uma linha de código em queaddend1
eaddend2
estão no escopo. - Pressione Enter. O DevTools avalia a instrução e exibe
6
, que é o resultado que você espera que a demonstração produza.
Esta captura de tela mostra a gaveta Console após a avaliação de parseInt(addend1) + parseInt(addend2)
.
Aplicar uma correção
Você encontrou uma correção para o bug. Agora, só resta testar a correção editando o código e executando novamente a demonstração. Não é necessário sair do DevTools para aplicar a correção. É possível editar o código JavaScript diretamente na interface do DevTools. Experimente agora:
- Clique em Retomar execução do script.
- No Editor de código, substitua a linha 31,
var sum = addend1 + addend2
, porvar sum = parseInt(addend1) + parseInt(addend2)
. - Pressione Command + S (Mac) ou Control + S (Windows, Linux) para salvar a alteração.
- Clique em Desativar pontos de interrupção. A cor muda para azul para indicar que está ativo. Enquanto essa configuração for definida, o DevTools ignorará todos os pontos de interrupção que você definir.
- Teste a demonstração com valores diferentes. A demonstração agora realiza o cálculo corretamente.
Próximas etapas
Este tutorial mostrou apenas duas maneiras de definir pontos de interrupção. O DevTools oferece muitas outras maneiras, incluindo:
- Pontos de interrupção condicionais, acionados somente quando a condição fornecida é verdadeira.
- Pontos de interrupção em exceções capturadas ou não capturadas.
- Pontos de interrupção XHR, acionados quando o URL solicitado corresponder a uma substring informada.
Consulte Pausar o código com pontos de interrupção para saber quando e como usar cada tipo.
Há alguns controles de acompanhamento de código que não foram explicados neste tutorial. Consulte Passar por linha de código para saber mais.