Este es material de referencia sobre los Heisenbags. Estamos hablando de cómo se ven y cómo se relacionan con los mainframes: los progenitores de la nube.
/ foto Lars Zimmermann CC BYHeisenbug (Heisenbug o Heisenbug) es un término que describe errores que cambian las propiedades durante la depuración de código. Es decir, desaparecen durante las pruebas y la depuración, pero aparecen en producción.
El nombre "Heisenbag" se refiere al
principio de incertidumbre de Heisenberg de la mecánica cuántica. En términos generales, puede describirse como un cambio inesperado en las propiedades del objeto observado como resultado de la observación.
La historia
El término Heisenbug se considera Bruce Lindsay, un empleado del Centro de Investigación de IBM. Ha contribuido al desarrollo de bases de datos relacionales y ha participado en el desarrollo del motor de base de datos empresarial
IBM System R.En 1985, mientras estudiaba en la Universidad de Berkeley, Bruce y
Jim Gray (James Nicholas Gray), un científico estadounidense en la teoría de sistemas informáticos,
trabajaron en el sistema operativo CAL-TSS. Fue escrito específicamente para el Mainframe de procesador dual
Control Process 6400 [
PDF , p. 3], en el cual los militares procesaron grandes cantidades de datos.
Por supuesto, durante el proceso de desarrollo hubo errores. Pero varios de ellos eran especiales: tan pronto como los ingenieros intentaron arreglarlos, desaparecieron. En ese momento, Lindsay solo estaba estudiando física y el principio de Heisenberg en particular. De repente, se dio cuenta de que Lindsay y él fueron testigos de un fenómeno similar: los errores desaparecieron porque la observación afectó las propiedades del objeto. De aquí vino el nombre "heisenbag".
Lindsay contó esta historia
en una entrevista con representantes de la
Asociación de Ingeniería Informática (ACM) en 2003.
Ejemplos de Heisenbug
Los usuarios en la red y en plataformas temáticas como Stack Overflow compartieron algunos ejemplos de heisenbags que conocieron en sus proyectos. Uno de los residentes de SO intentó calcular el área de la figura entre dos curvas con una precisión de tres decimales. Para depurar el algoritmo en C ++, agregó la línea:
cout << current << endl;
Pero tan pronto como lo comentó, el código dejó de funcionar y se repitió. El programa
fue el siguiente :
#include <iostream> #include <cmath> using namespace std; double up = 19.0 + (61.0/125.0); double down = -32.0 - (2.0/3.0); double rectangle = (up - down) * 8.0; double f(double x) { return (pow(x, 4.0)/500.0) - (pow(x, 2.0)/200.0) - 0.012; } double g(double x) { return -(pow(x, 3.0)/30.0) + (x/20.0) + (1.0/6.0); } double area_upper(double x, double step) { return (((up - f(x)) + (up - f(x + step))) * step) / 2.0; } double area_lower(double x, double step) { return (((g(x) - down) + (g(x + step) - down)) * step) / 2.0; } double area(double x, double step) { return area_upper(x, step) + area_lower(x, step); } int main() { double current = 0, last = 0, step = 1.0; do { last = current; step /= 10.0; current = 0; for(double x = 2.0; x < 10.0; x += step) current += area(x, step); current = rectangle - current; current = round(current * 1000.0) / 1000.0; //cout << current << endl; //<-- COMMENT BACK IN TO "FIX" BUG } while(current != last); cout << current << endl; return 0; }
La esencia del heisenbug : cuando no hay impresión, el programa realiza comparaciones con alta precisión en los registros del procesador. Además, la precisión del resultado supera las capacidades del doble. Para generar el valor, el compilador devuelve el resultado de los cálculos a la memoria principal, mientras que la parte fraccionaria se descarta. Y la comparación posterior en while conduce al resultado correcto. Cuando se comenta una línea, no hay truncamiento implícito de la parte fraccional. Por esta razón, los dos valores en while siempre parecen ser desiguales entre sí. Como solución al problema, uno de los participantes en la discusión sugirió usar una comparación aproximada de números de coma flotante.
Otra historia sobre el heisenbug fue
compartida por ingenieros que trabajan con el entorno de lenguaje
Smalltalk-80 en Unix. Se dieron cuenta de que el sistema se bloqueaba si lo dejaba inactivo durante un tiempo. Pero después de mover el cursor del mouse, todo volvió a funcionar como siempre.
El problema fue con el planificador de Unix, que redujo la prioridad de las tareas que están inactivas. En algún momento, la prioridad se redujo tanto que los procesos en Smalltalk no tuvieron tiempo de completarse. La pila de tareas creció y colgó el programa. Cuando el usuario movió el cursor, el sistema operativo restableció la prioridad y todo volvió al punto de partida.
Otros * errores
Hay varios términos que describen todo tipo de errores: Borbag, Mandelbug, Schrödinbag.
Borbag , lo opuesto a Heisenbug, es un error común que es fácil de encontrar y solucionar. Lleva el nombre de Niels Bohr, quien en 1913 propuso un modelo simple y comprensible de la estructura del átomo. Según este modelo, los electrones de un átomo se mueven en ciertas órbitas, lo que significa que se puede predecir su momento y radio de movimiento. Del mismo modo, la apariencia de Borbags se puede predecir si se crean las condiciones necesarias para ellos.
/ foto OLCF en ORNL CC BYSchroedinbag es un error que existe y no existe al mismo tiempo, hasta que el desarrollador lo mire. El error fue nombrado en honor a un famoso
experimento mental .
En cuanto a
Mandelbug , este es un error debido a que el sistema se comporta de manera errática e impredecible. El fenómeno lleva el nombre del físico, matemático y creador de la geometría fractal
Benoit Mandelbrot .
Cual es el resultado
Hay
muchos ejemplos de Heisenbags (y otros * errores). Son muy difíciles de encontrar, pero las causas suelen ser comunes: una variable no inicializada, errores de sincronización en un entorno de subprocesos múltiples o problemas con
los algoritmos de
eliminación de código muerto . Resulta que para hacer frente a tales errores, deben cortarse incluso en la etapa de diseño de la aplicación.
Desde el blog corporativo IaaS: