Técnicas de debug
Como encontrar e corrigir bugs de forma sistemática: ferramentas, abordagens e os erros que devs cometem quando estão presos num problema.
Debug é o que separa devs que ficam presos em um problema de devs que destravam a si mesmos. Não é sobre inteligência, é sobre método. A maioria aprende debug por acaso (tentativa e erro ao longo de anos). Este guia comprime a abordagem. O insight central: bugs não mentem. O código faz exatamente o que você mandou fazer. O bug está na sua compreensão, não no computador. Se você aprender a debug de forma sistemática, vai economizar horas toda semana.
O ciclo básico de debug
O modelo mental antes de alcançar qualquer ferramenta:
- Reproduzir: consegue fazer acontecer de novo? De forma confiável? Se não consegue reproduzir consistentemente, não consegue debugar.
- Isolar: reduza onde acontece. Abordagem busca binária: comenta metade do código, ainda acontece? Continue cortando pela metade.
- Entender: forme uma hipótese sobre o por quê. Não adivinhe aleatoriamente, faça uma previsão e teste.
- Corrigir: só depois que entender a causa raiz. Corrigir sintomas é temporário.
- Verificar: o fix realmente resolveu? Quebrou algo mais?
Note que mudar as coisas aleatoriamente sem entender é "programação voodoo", às vezes "funciona" mas o bug volta.
Console.log e print: subestimados, mas funcionam
A humilde declaração de print é subestimada. Colocação estratégica bate debugger para maioria dos bugs. Técnicas:
- Imprima valores na entrada de cada função para rastrear fluxo de dados
- Imprima antes e depois da linha suspeita
- Imprima tipos, não só valores (
typeof,type()) - Use labels descritivos:
console.log("valor antes do filtro:", items)não sóconsole.log(items)
Dica: muitos logs criam ruído. Remova debug prints antes de committar (ou use um logger com níveis).
Usando o debugger de verdade
Quando print não basta, use o debugger step-through. Intro prático:
- Browser DevTools: aba Sources, breakpoints, step over/into/out
- VS Code debugger: launch.json, breakpoints na IDE, funciona para Node.js, Python, etc
- Conceitos: breakpoint (pause aqui), step over (próxima linha), step into (entra na função), step out (sai da função), watch expressions (observa uma variável), call stack (como chegamos aqui)
Dica concreta: coloca breakpoint LOGO ANTES do bug, não antes de tudo. Depois dá step line a line e observa quando o valor fica errado.
Erros comuns de devs presos num bug
Os antipadrões:
- Mudar muitas coisas ao mesmo tempo: você não sabe mais o que fixou (ou se fixou algo). Muda uma coisa, testa, depois muda a próxima.
- Não ler o erro completo: o stack trace te diz arquivo e linha. Maioria lê primeira linha e chuta. Lê tudo, especialmente a parte "caused by".
- Assumir que o bug está onde você está olhando: o erro se manifesta na linha 47 mas a causa é na linha 12 onde dados ruins foram criados.
- Debug por esperança: "deixa eu tentar essa coisa aleatória" sem hipótese. Consome horas.
- Não usar git bisect: se algo funcionou ontem e quebrou hoje,
git bisectfaz busca binária no seu histórico git para achar o commit que quebrou.
Ferramentas e técnicas específicas por sintoma
Referência rápida, não exaustiva:
- Erro de tipo, null, undefined: adicione validação de entrada na função, log do valor antes da linha que quebra
- Loop infinito ou lentidão: use profiler do browser ou
time <comando>no terminal para medir, adicione contador temporário no loop - Bug intermitente (race condition): adicione timestamps nos logs, procure por async/await faltando, eventos disparados fora de ordem
- "Funcionava ontem":
git diff HEAD~1mostra o que mudou,git bisectse histórico for longo - Bug só em produção: ative logging mais verboso em produção temporariamente, reproduza localmente com dados de produção (anonimizados)
Próximos passos
Debug é uma habilidade prática que melhora com prática. Próximo passo: leia o-que-sao-apis-e-como-usar para técnicas específicas de debugar chamadas de API.
Checklist antes de próxima vez que travar:
- [ ] Consigo reproduzir o bug de forma consistente antes de tentar corrigir?
- [ ] Leio o stack trace completo quando aparece um erro?
- [ ] Já usei o debugger do VS Code ou do browser pelo menos uma vez?
- [ ] Conheço o conceito de git bisect para encontrar commits que introduziram bugs?