Heisenbug
Im Jargon der Computerprogrammierung ist ein Heisenbug ein Softwarefehler, der zu verschwinden oder sein Verhalten zu verändern scheint, wenn man versucht, ihn zu untersuchen.[1] Der Begriff ist ein Wortspiel mit dem Namen Werner Heisenberg, dem Physiker, der als erster den Beobachtereffekt der Quantenmechanik geltend machte, der besagt, dass der Akt der Beobachtung eines Systems unweigerlich seinen Zustand verändert. In der Elektronik ist der traditionelle Begriff der Sondeneffekt, bei dem das Anbringen einer Testsonde an ein Gerät dessen Verhalten verändert.
Ähnliche Begriffe wie Bohrbug, Mandelbug, Hindenbug und Schrödinbug (siehe den Abschnitt über verwandte Begriffe) wurden gelegentlich für andere Arten von ungewöhnlichen Softwarefehlern vorgeschlagen, manchmal im Scherz; im Gegensatz zum Begriff Heisenbug sind sie jedoch nicht allgemein bekannt oder verwendet.
Beispiele
Heisenbugs treten meist auf bei Programmierfehlern, die durch das Untersuchen/Debuggen eines Computerprogramms beeinflusst werden, wie z. B. das Einfügen von Eingabe- und Ausgabe-Anweisungen oder die Ausführung (Berechnung) mit einem Debugger, wodurch als Nebeneffekt das Verhalten des Programms auf subtile Weise verändert wird, wie z. B. die Änderung der Speicheradresse von Variablen und der Zeitpunkt der Ausführung.
Ein häufiges Beispiel für einen Heisenbug ist ein Programmierfehler, der zu einem Laufzeitfehler führt, wenn das Programm mit einem optimierenden Compiler kompiliert wird, aber nicht, wenn dasselbe Programm ohne Optimierung kompiliert wird (wie es oft zum Zweck der Untersuchung mit einem Debugger gemacht wird). Während des Debuggens werden Werte, die ein optimiertes Programm normalerweise in Registern behalten würde, oft in den Hauptspeicher geschoben. Dies kann z. B. das Ergebnis einer Fließkommarechnung beeinflussen, da der Wert im Speicher einen kleineren Bereich und eine geringere Genauigkeit haben kann als der Wert im Register. In ähnlicher Weise können Heisenbugs durch Nebenwirkungen in Testausdrücken verschwinden: Der Fehler tritt während der Entwicklung nicht auf, da zur Laufzeit die Assertions in Sprachen wie C und C++ ausgeführt werden; der Testausdruck wird jedoch nicht mehr ausgewertet, wenn im Produktionscode mit dem Makro NDEBUG
die Assertions abgeschaltet werden – nun tritt der Fehler auf.
Andere häufige Ursachen von Heisenbugs sind Programmierfehler wie das Verwenden des Wertes einer nicht initialisierten Variablen (die ihre Adresse und/oder ihren Anfangswert während des Debuggens ändern kann) oder das Folgen eines invaliden Zeigers (der beim Debuggen auf eine andere Stelle verweisen kann). Debugger erlauben im Allgemeinen auch die Verwendung von Haltepunkten oder bieten andere Benutzeroberflächen, die zusätzlichen Quellcode verursachen (wie z. B. Property-Accessoren), welcher im Verborgenen ausgeführt wird, was Timing-relevante Fehler verbergen kann.
Verwandte Begriffe
Ein Bohrbug ist dagegen ein "guter, solider Bug". Wie das deterministische Bohrsche Atommodell ändern sie ihr Verhalten nicht und sind relativ leicht zu entdecken.
Ein Mandelbug (benannt nach der "Mandelbrot-Menge" von Benoît Mandelbrot) ist ein Fehler, dessen Ursachen so komplex sind, dass er sich nicht reparieren lässt oder sein Verhalten als chaotisch oder sogar als nichtdeterministisches System erscheinen lässt. Der Begriff bezieht sich auch auf einen Fehler, der fraktales Verhalten (d. h. Selbstähnlichkeit) aufweist, indem er mehr Fehler aufdeckt (je tiefer ein Entwickler in den Code eindringt, um ihn zu beheben, desto mehr Fehler findet er).
Ein Schrödingbug (benannt nach Erwin Schrödinger und seinem Gedankenexperiment) ist ein Fehler, der sich in laufender Software manifestiert, nachdem ein Programmierer bemerkt, dass der Code von vornherein nicht hätte funktionieren dürfen.
Ein Hindenbug (benannt nach der Hindenburg-Katastrophe) ist ein Fehler mit katastrophalem Verhalten.
Ein Higgs-Bugson (benannt nach dem Higgs-Boson-Teilchen) ist ein Fehler, dessen Existenz aufgrund anderer beobachteter Bedingungen vorhergesagt wird z. B. durch vage verwandte Protokolleinträge und anekdotische Benutzerberichte. Er ist aber in einer Entwicklungs- oder Testumgebung schwer, wenn nicht gar unmöglich künstlich zu reproduzieren. Der Begriff kann sich auch auf einen Fehler beziehen, der im Code offensichtlich ist (mathematisch bewiesen), der aber in der Ausführung nicht zu sehen ist (und dessen tatsächliche Existenz nur schwer oder gar nicht gefunden werden kann).
Einzelnachweise
- heisenbug. Abgerufen am 17. April 2020.