Dies ist Referenzmaterial zu den Heisenbags. Wir sprechen darüber, wie sie aussehen und wie sie sich auf Mainframes beziehen - die Vorläufer der Cloud.
/ Foto Lars Zimmermann CC BYHeisenbug (Heisenbug oder Heisenbug) ist ein Begriff, der Fehler beschreibt, die Eigenschaften während des Code-Debuggens ändern. Das heißt, sie verschwinden beim Testen und Debuggen, erscheinen aber in der Produktion.
Der Name „Heisenbag“ bezieht sich auf das
Heisenbergsche Unsicherheitsprinzip der Quantenmechanik. Im Allgemeinen kann es als unerwartete Änderung der Eigenschaften des beobachteten Objekts infolge der Beobachtung beschrieben werden.
Die Geschichte
Der Begriff "Heisenbug" gilt als Mitarbeiter des Forschungszentrums IBM Bruce Lindsay (Bruce Lindsay). Er hat zur Entwicklung relationaler Datenbanken beigetragen und war an der Entwicklung der
IBM System R Enterprise Database Engine beteiligt.
Während seines Studiums an der University of Berkeley arbeiteten Bruce und
Jim Gray (James Nicholas Gray), ein amerikanischer Wissenschaftler in der Theorie der Computersysteme, 1985 am OS CAL-TSS. Es wurde speziell für den
Control Process 6400 Dual-Prozessor-Mainframe [
PDF , S. 3] geschrieben, auf dem das Militär große Datenmengen verarbeitete.
Natürlich gab es während des Entwicklungsprozesses Fehler. Aber einige von ihnen waren etwas Besonderes - sobald die Ingenieure versuchten, sie zu reparieren, verschwanden sie. Zu dieser Zeit studierte Lindsay nur Physik und insbesondere das Heisenberg-Prinzip. Plötzlich dämmerte es Lindsay - er und Gray erlebten ein ähnliches Phänomen: Die Fehler verschwanden, weil die Beobachtung die Eigenschaften des Objekts beeinflusste. Von hier kam der Name "Heisenbag".
Lindsay erzählte diese Geschichte
in einem Interview mit Vertretern der
Association of Computing Engineering (ACM) im Jahr 2003.
Heisenbug-Beispiele
Benutzer im Netzwerk und auf thematischen Plattformen wie Stack Overflow haben einige Beispiele für Heisenbags geteilt, die sie in ihren Projekten kennengelernt haben. Einer der SO-Bewohner versuchte, die Fläche der Figur zwischen zwei Kurven mit einer Genauigkeit von drei Dezimalstellen zu berechnen. Um den Algorithmus in C ++ zu debuggen, fügte er die folgende Zeile hinzu:
cout << current << endl;
Aber sobald er es kommentierte, funktionierte der Code nicht mehr und wurde wiederholt. Das Programm
war wie folgt :
#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; }
Das Wesentliche des Heisenbugs : Wenn kein Ausdruck vorhanden ist, führt das Programm Vergleiche mit hoher Genauigkeit in den Prozessorregistern durch. Darüber hinaus übersteigt die Genauigkeit des Ergebnisses die Fähigkeiten von double. Um den Wert auszugeben, gibt der Compiler das Ergebnis der Berechnungen an den Hauptspeicher zurück - während der Bruchteil verworfen wird. Und der anschließende Vergleich in while führt zum richtigen Ergebnis. Wenn eine Zeile auskommentiert wird, erfolgt keine implizite Kürzung des Bruchteils. Aus diesem Grund erweisen sich die beiden Werte in while immer als ungleich zueinander. Als Lösung für das Problem schlug einer der Diskussionsteilnehmer vor, einen ungefähren Vergleich der Gleitkommazahlen zu verwenden.
Eine andere Geschichte über den Heisenbug wurde
von Ingenieuren geteilt, die mit der
Smalltalk-80- Sprachumgebung unter Unix arbeiten. Sie bemerkten, dass das System abstürzte, wenn Sie es eine Weile im Leerlauf ließen. Aber nach dem Bewegen des Mauszeigers funktionierte alles wieder wie gewohnt.
Das Problem war mit dem Unix-Scheduler, der die Priorität von Aufgaben im Leerlauf senkte. Irgendwann wurde die Priorität so stark reduziert, dass die Prozesse in Smalltalk keine Zeit mehr hatten. Der Aufgabenstapel wuchs und hängte das Programm. Wenn der Benutzer den Cursor bewegte, stellte das Betriebssystem die Priorität wieder her und alles kehrte auf den ersten Platz zurück.
Andere * Fehler
Es gibt eine Reihe von Begriffen, die alle Arten von Fehlern beschreiben: Borbag, Mandelbug, Schrödinbag.
Borbag , das Gegenteil von Heisenbug, ist ein häufiger Fehler, der leicht zu finden und zu beheben ist. Benannt nach Niels Bohr, der 1913 ein einfaches und verständliches Modell der Struktur des Atoms vorschlug. Nach diesem Modell bewegen sich die Elektronen eines Atoms in bestimmten Bahnen, was bedeutet, dass ihr Impuls und ihr Bewegungsradius vorhergesagt werden können. Ebenso kann das Auftreten von Borbags vorhergesagt werden, wenn die notwendigen Bedingungen dafür geschaffen werden.
/ Foto OLCF bei ORNL CC BYSchroedinbag ist ein Fehler, der existiert und nicht gleichzeitig existiert, bis der Entwickler ihn betrachtet. Der Fehler wurde zu Ehren eines berühmten
Gedankenexperiments benannt .
Der
Mandelbug ist ein Fehler, aufgrund dessen sich das System unregelmäßig und unvorhersehbar verhält. Das Phänomen ist nach dem Physiker, Mathematiker und Schöpfer der fraktalen Geometrie
Benoit Mandelbrot benannt .
Was ist das Ergebnis?
Es gibt
viele Beispiele für Heisenbags (und andere * Bugs). Sie sind sehr schwer zu finden, aber die Ursachen sind normalerweise häufig: eine nicht initialisierte Variable, Synchronisationsfehler in einer Multithread-Umgebung oder Probleme mit Algorithmen zum
Entfernen toten Codes . Es stellt sich heraus, dass solche Fehler bereits in der Phase des Anwendungsdesigns abgeschnitten werden müssen, um sie zu beheben.
Aus dem IaaS-Unternehmensblog: