Se você já passou horas caçando um bug que sumia ao adicionar um print, sabe que debugging é uma arte. As técnicas avançadas de debugging vão além do básico e transformam a caça aos erros em um processo metódico. Aqui estão 7 que poucos conhecem.
1. Método do pato de borracha
Pegue um objeto qualquer, um pato de borracha, um boneco, uma caneca, e explique seu código para ele, linha por linha, como se ele fosse um colega. O simples ato de verbalizar o raciocínio força seu cérebro a organizar a lógica e frequentemente revela o erro antes mesmo de terminar a explicação.
Exemplo concreto: Um desenvolvedor da Stack Overflow relatou ter resolvido um bug de 3 horas em 5 minutos ao explicar o problema para um ursinho de pelúcia.
2. Bisect binário no histórico de commits
Quando um bug aparece e você não sabe qual mudança o causou, use git bisect. Ele marca um commit bom (sem o bug) e um ruim (com o bug) e automaticamente testa os commits intermediários, reduzindo o espaço de busca pela metade a cada iteração.
Dado prático: Em um projeto com 1000 commits, o bisect encontra o commit culpado em no máximo 10 testes manuais.
3. Watchpoints (breakpoints em dados, não em código)
Breakpoints param a execução numa linha específica. Watchpoints param quando uma variável ou região de memória muda de valor, ideal para bugs de corrupção de dados ou variáveis alteradas inesperadamente.
Exemplo: No Visual Studio e no GDB, use watch myVariable para parar automaticamente quando myVariable for modificada.
4. Logging assíncrono com níveis de severidade
Logs tradicionais travam a execução e alteram o timing do programa. Logging assíncrono escreve em fila separada, sem interferir na performance. Adicione níveis (DEBUG, INFO, WARN, ERROR) e filtre por ambiente.
Dica: Use bibliotecas como loguru (Python) ou serilog (C#) que suportam rotação e envio remoto.
5. Breakpoints condicionais
Em vez de parar a cada iteração de um loop de 10 mil passos, configure uma condição: "pare quando i == 573" ou "pare quando a variável for null". Economiza cliques e paciência.
Cenário real: Um bug que só aparecia no 573º registro de um CSV foi encontrado em segundos com um breakpoint condicional.
6. Delta debugging (minimização automática do caso de teste)
Técnica que reduz automaticamente um conjunto de dados ou código até o menor exemplo que ainda reproduz o bug. Ferramentas como ddmin ou o próprio git bisect implementam essa ideia.
Aplicação: Em vez de depurar um arquivo de 10 MB, você descobre que o bug acontece com apenas 3 linhas específicas.
7. Técnica do colega distraído
Peça para um colega (de preferência que não conhece o código) ler seu problema e fazer perguntas ingênuas. Muitas vezes a pergunta mais simples, "por que você está usando esse if?", revela a suposição errada.
Curiosidade: Grandes empresas como Microsoft e Google têm salas de "debugging buddy" justamente para isso.
FAQ
Qual técnica funciona para bugs intermitentes?
Bisect binário e logging assíncrono são os mais indicados. O bisect isola a mudança que introduziu o bug; o logging assíncrono captura o estado sem alterar o timing.
Como usar watchpoints no GDB?
No terminal, compile com -g, carregue o binário no GDB e digite watch nome_da_variavel. O programa para automaticamente quando o valor mudar.
O pato de borracha realmente funciona?
Sim, o ato de explicar o código em voz alta força seu cérebro a processar cada linha de forma mais cuidadosa. É uma técnica validada por milhares de desenvolvedores.
Qual a diferença entre breakpoint condicional e watchpoint?
Breakpoint condicional para numa linha específica quando uma condição é verdadeira. Watchpoint para quando uma variável muda, independentemente da linha.
Delta debugging serve só para código?
Não, serve para qualquer entrada de dados: arquivos de configuração, parâmetros de API, até mesmo cadeias de comandos. O princípio é sempre minimizar o caso de teste.
Preciso de ferramentas caras para usar essas técnicas?
Não. Todas as técnicas listadas têm implementações gratuitas: GDB, git, bibliotecas open source de logging e até mesmo um pato de pelúcia de R$ 20.
Próximo passo prático
Escolha a técnica que mais se encaixa no seu bug atual. Se o erro é intermitente, comece com logging assíncrono. Se você sabe quando o bug apareceu, use git bisect. Se o bug é de lógica, pegue um pato de borracha e comece a explicar. Teste uma por semana e veja qual vira seu novo superpoder de debugging.
