heisenbug

folclore

programação

Um bug que muda de comportamento ou desaparece quando você tenta observá-lo.

Batizado em referência ao princípio da incerteza, um heisenbug é aquele que some sob o depurador, ou só aparece em produção, porque o ato de observar (log extra, tempo mais lento, um ponto de parada) perturba as condições de tempo ou memória que o causam. Seu oposto, sempre reproduzível, é o bohrbug.

Um heisenbug desaparece quando você tenta observá-lo. Anexe um depurador e o programa se comporta; acrescente um print e a falha some; rode sob um profiler e está tudo bem. O nome toma emprestado o princípio da incerteza de Heisenberg como piada, e o mecanismo por baixo é inteiramente banal.

A observação muda o tempo, e o tempo em geral é o bug. Um depurador serializa threads que estavam em corrida, um print acrescenta microssegundos que deixam a thread mais lenta terminar primeiro, e uma compilação de depuração inicializa memória que a de produção deixa com o que estivesse lá antes. O bug não se escondeu; você mudou as condições que o produziam.

É por isso que esse diagnóstico é um sinal forte, e não uma frustração. Uma falha que evapora sob observação é quase certamente uma condição de corrida, uma leitura de memória não inicializada, ou uma dependência de comportamento indefinido que o otimizador trata de outro jeito. A resposta produtiva é parar de tentar pegá-lo ao vivo e passar a raciocinar sobre a concorrência, habilitar sanitizadores que detectam a classe em vez da instância, e acrescentar registro que grave sem alterar o tempo. Persegui-lo interativamente é perseguir o próprio instrumento.

Também conhecido como: heisenbug, heisenberg bug

Fontes

  • The Jargon File

Todos os verbetes do glossário