Definición
Un defecto de software cuyo comportamiento observable cambia, desaparece o se vuelve irreproducible cuando se intenta observar, instrumentar o depurarlo—típicamente porque el acto de observar perturba el tiempo, el layout de memoria o la planificación, enmascarando la causa raíz.
Principio
Principio
La observación puede cambiar el estado en sistemas complejos. En código concurrente, optimizado o sensible al tiempo, añadir registros, puntos de interrupción o sondas puede alterar la alineación de memoria, el orden de planificación o las decisiones de optimización, eliminando así las condiciones necesarias para que se manifieste el fallo.
Demostración
Demostración
Escenario concreto: una condición de carrera que corrompe datos cuando dos hilos se entrelazan en una ventana de microsegundos; insertar un printf o conectar un depurador desplaza el tiempo y la corrupción deja de ocurrir, dificultando la reproducción y el análisis de la causa raíz.
Aplicación incorrecta
Aplicación incorrecta
Descartar un Heisenbug como 'inexistente' porque desaparece bajo inspección, o asumir que todos los errores no deterministas son Heisenbugs. Otro uso indebido es instrumentar de forma pesada de modo que se oculte el fallo en lugar de usar trazas de bajo impacto o reproducción determinista.
Consecuencia
Consecuencia
Los Heisenbugs complican la depuración y aumentan la dependencia de diagnósticos no intrusivos, pruebas de estrés y aleatorias, herramientas de grabación/reproducción determinista y el endurecimiento del código. Si se diagnostican mal, conducen a esfuerzos desperdiciados y a arreglos frágiles que no corrigen la nondeterminismo subyacente.
Inversión
Inversión
Hacer reproducible el fallo controlando o grabando la nondeterminismo: usar planificadores deterministas, herramientas record-replay, sondas más ligeras, muestreo aumentado o añadir aserciones e invariantes que expongan la falla sin perturbar las condiciones que la provocan.
Límite
Límite
Se aplica principalmente a fallos no deterministas dependientes del tiempo, la concurrencia o la optimización; no incluye errores que siempre se reproducen pero son difíciles de localizar por su complejidad. El término es informal y antropomórfico; su uso debe ser diagnóstico y no excusa para una instrumentación pobre.
Tensión semántica
Tensión semántica
Compite con términos como bohrbug (determinista, reproducible), mandelbug (complejo, emergente) y Schrödinbug (error que aparece al ser corregido). La tensión es si la desaparición bajo observación indica la ausencia del defecto o solo el enmascaramiento de sus condiciones de activación.
Síntesis
Síntesis
Un Heisenbug es la manifestación del principio más amplio de que la observación altera el comportamiento en software complejo: por ello, la depuración debe usar métodos que eviten la perturbación (trazas no intrusivas) o controlen la nondeterminismo (record-replay, entornos deterministas) para descubrir las causas reales.