En la jerga de la programación informática , un Heisenbug es un error de software que parece desaparecer o alterar su comportamiento cuando uno intenta estudiarlo. [1] El término es un juego de palabras con el nombre de Werner Heisenberg , el físico que afirmó por primera vez el efecto del observador de la mecánica cuántica , que afirma que el acto de observar un sistema altera inevitablemente su estado. En electrónica, el término tradicional es efecto sonda , donde conectar una sonda de prueba a un dispositivo cambia su comportamiento.
Términos similares, como bohrbug , mandelbug , [2] [3] [4] hindenbug y schrödinbug [5] [6] (ver la sección sobre términos relacionados) se han propuesto ocasionalmente para otros tipos de errores de software inusuales, a veces en broma. [7] [8]
Los Heisenbugs ocurren porque los intentos comunes de depurar un programa , como insertar declaraciones de salida o ejecutarlo con un depurador , generalmente tienen el efecto secundario de alterar el comportamiento del programa de formas sutiles, como cambiar las direcciones de memoria de las variables y el tiempo de su ejecución.
Un ejemplo común de un heisenbug es un error que aparece cuando el programa se compila con un compilador optimizador , pero no cuando el mismo programa se compila sin optimización (como se hace a menudo con el fin de examinarlo con un depurador). Durante la depuración, los valores que un programa optimizado normalmente mantendría en registros a menudo se envían a la memoria principal. Esto puede afectar, por ejemplo, el resultado de las comparaciones de punto flotante , ya que el valor en la memoria puede tener un rango y una precisión menores que el valor en el registro [ cita requerida ] . De manera similar, los heisenbugs pueden ser causados por efectos secundarios en expresiones de prueba utilizadas en aserciones de tiempo de ejecución en lenguajes como C y C++ , donde la expresión de prueba no se evalúa cuando las aserciones se desactivan en el código de producción utilizando la NDEBUG
macro.
Otras causas comunes de errores de programación son el uso del valor de una variable no inicializada (que puede cambiar su dirección o valor inicial durante la depuración) o el seguimiento de un puntero no válido (que puede apuntar a un lugar diferente durante la depuración). Los depuradores también suelen permitir el uso de puntos de interrupción o proporcionar otras interfaces de usuario que hacen que se ejecute código fuente adicional (como accesores de propiedades) de forma sigilosa, lo que puede, a su vez, cambiar el estado del programa. [9]
Los usuarios finales pueden experimentar un error de Heisenbug cuando el acto de hacer una captura de pantalla del error de Heisenbug para observarlo soluciona el problema y la captura de pantalla muestra un estado de funcionamiento perfecto. Este efecto puede ocurrir cuando complejos paquetes de software trabajan juntos, por ejemplo, un navegador web que utiliza una aceleración de tarjeta gráfica de hardware que causa errores de representación en la pantalla física que no se muestran en una captura de pantalla.
El tiempo también puede ser un factor en los errores de Heisen, en particular en aplicaciones multiproceso. La ejecución de un programa bajo el control de un depurador puede cambiar el tiempo de ejecución del programa en comparación con la ejecución normal. Los errores sensibles al tiempo, como las condiciones de carrera , pueden no ocurrir cuando el programa se ralentiza mediante la ejecución de líneas de código fuente en un solo paso en el depurador. Esto es particularmente cierto cuando el comportamiento implica la interacción con una entidad que no está bajo el control de un depurador, como cuando se depura el procesamiento de paquetes de red entre dos máquinas y solo una está bajo el control del depurador.
Los errores de Heisen pueden considerarse ejemplos del efecto del observador en la tecnología de la información . Los programadores frustrados pueden atribuir humorísticamente un error de Heisen a la fase de la luna [10] o (si ha ocurrido solo una vez) pueden justificarlo como un error leve debido a partículas alfa o rayos cósmicos que afectan el hardware, un fenómeno bien documentado conocido como efectos de evento único .
Por el contrario, un bohrbug es un "buen y sólido bicho". Al igual que el modelo atómico determinista de Bohr , no cambian su comportamiento y se detectan con relativa facilidad. [11] [12]
Un mandelbug (llamado así por el fractal de Benoît Mandelbrot ) es un error cuyas causas son tan complejas que desafían la reparación, o hacen que su comportamiento parezca caótico o incluso no determinista . [2] El término también se refiere a un error que exhibe un comportamiento fractal (es decir, autosimilitud ) al revelar más errores (cuanto más profundiza un desarrollador en el código para solucionarlo, más errores encuentra). [ cita requerida ]
Un schrödinbug o schroedinbug (llamado así por Erwin Schrödinger y su experimento mental ) es un error que se manifiesta en un software en ejecución después de que un programador se da cuenta de que el código nunca debería haber funcionado en primer lugar. [5]
Un hindenbug [13] (llamado así por el desastre del Hindenburg ) es un insecto con un comportamiento catastrófico.
Un bosón de Higgs [14] [15] (denominado así por la partícula del bosón de Higgs ) es un error cuya existencia se predice en función de otras condiciones observadas (más comúnmente, entradas de registro vagamente relacionadas e informes anecdóticos de usuarios), pero que es difícil, si no imposible, de reproducir artificialmente en un entorno de desarrollo o prueba. El término también puede referirse a un error que es obvio en el código (probado matemáticamente), pero que no se puede ver en la ejecución (pero que es difícil o imposible de encontrar en realidad).
El término fue utilizado en 1985 por Jim Gray , en un artículo sobre fallos de software [16] (y a veces se le atribuye erróneamente debido a esta publicación) y también en 1986 por Jonathan Clark y Zhahai Stewart en la lista de correo (más tarde grupo de noticias de Usenet ) comp.risks . [17]
Bruce Lindsay, un investigador de IBM , afirmó en una entrevista con ACM Queue en 2004 que estuvo presente cuando se definió originalmente el Heisenbug. [18]
Una aparición anterior en publicaciones de ACM es de 1983. [19]
Los errores de Heisen son difíciles de identificar y solucionar; a menudo, intentar resolverlos conduce a un comportamiento inesperado. Debido a que el problema se manifiesta como resultado de un error subyacente independiente, el comportamiento puede ser difícil de predecir y analizar durante la depuración. En general, la cantidad de errores de Heisen identificados debería disminuir a medida que un software madura. [20]
Éste es el principio de incertidumbre de Heisenberg aplicado a la depuración (un participante denominó un error de este tipo "Heisenbug").
También citado en LeBlanc, Richard J.; Robbins, Arnold D.; Event-Driven Monitoring of Distributed Programs , en Actas de la 5.ª Conferencia Internacional IEEE sobre Sistemas de Computación Distribuida (ICDCS) , IEEE Computer Society, Computer Society Press, 1985, págs. 515-522 Búsqueda de libros en Google:
Este es el principio de incertidumbre de Heisenberg aplicado a la depuración, a veces llamado principio "Heisenbug" [ACM83].
{{cite book}}
: CS1 maint: varios nombres: lista de autores ( enlace )