Heisenbug

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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.

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 typisches Szenario, die zu einem Heisenbug führt, sind Race-Condition-Fehler. Dabei führt die Untersuchung selbst zu einer Veränderung des Timings der Anwendung und der beobachtete Fehler tritt deswegen nicht mehr auf. Dies kann durch zusätzliche Diagnoseausgaben entstehen oder aber bereits allein dadurch, dass ein Debugger aktiv ist.

Ein 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 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.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. heisenbug. Abgerufen am 17. April 2020.