Suche nach Bugs mit der Lupe
Heisenbugs
Wenn Computer launenhaft sind (03.01.2023)
Förderjahr 2022 / Stipendien Call #17 / ProjektID: 6428 / Projekt: Automated Diagnosis of Heisenbugs

 

Man sitzt vor dem Rechner, führt zehnmal hintereinander ohne Probleme dieselbe Operation aus. Beim elften Mal stürzt das Programm plötzlich ab oder gibt eine Fehlermeldung, obwohl man nichts an den Schritten und Eingaben verändert hat - solches Verhalten ist sowohl für Nutzer:innen als auch für Entwickler:innen, die für die Fehlerbehebung zuständig sind, sehr frustrierend. Sobald man versucht, den Fehler gezielt zu reproduzieren und zu verstehen, was zum Problem führt, tritt der Fehler meist nicht mehr auf. In Anlehnung an die Heisenbergsche Unschärferelation, werden derartige Fehler (englisch Bugs) im Software Engineering Jargon daher als Heisenbugs bezeichnet. 

 

Was macht Heisenbugs so problematisch?

 

Aus menschlicher Sicht sind Heisenbugs unangenehm, weil sie – salopp gesagt – den Eindruck entstehen lassen, zufälligen Launen des Computersystems schutzlos ausgeliefert zu sein. 

Aber auch aus technischer Sicht bergen Heisenbugs besondere Herausforderungen. Der erste Schritt jeder Fehlerbehebung ist die Suche nach der Fehlerursache. Typischerweise wird das Programm zu diesem Zwecke wiederholt ausgeführt und die einzelnen Schritte werden genau verfolgt, zum Beispiel mit Hilfe eines Debuggers, der es erlaubt, nach jedem Rechenschritt die Werte aller beteiligten Variablen auszulesen. Enthält das Programm einen Heisenbug, kann es aber gut sein, dass der Fehler bei der erneuten Ausführung nicht mehr oder nur sehr selten auftritt. Da Debugger außerdem die zeitliche Abfolge von Rechenschritten und damit die Rahmenbedingungen der Ausführung leicht verändern, kann es sogar sein, dass der Fehler gar nicht mehr auftritt, sobald man Debugger verwendet. Der Standardweg zur Fehlerbehebung schlägt daher bei Heisenbugs oft fehl.

Eine weitere Herausforderung besteht darin, dass automatische Software Tests, die den Zweck haben, Programmfehler frühzeitig zu entdecken, in diesem Zusammenhang keine zuverlässigen Garantien mehr geben. Tests, die einmal erfolgreich durchlaufen, können bei späteren Ausführungen fehlschlagen. Um Heisenbugs trotz dieser Herausforderungen zu entdecken und zu beheben, ist es wichtig, ihre Ursachen besser zu verstehen. 

 

Wie entstehen Heisenbugs?

 

Die Ursachen dafür, dass Fehler trotz gleicher Eingaben manchmal auftreten und manchmal nicht, liegen in versteckten Parametern der Systemumgebung, die die Ausführung beeinflussen. Solche Parameter gibt es auf vielen Systemebenen, zum Beispiel:

 

  • CPU Architekturen: Moderne CPUs führen Instruktionen nicht immer in der vorgegebenen Reihenfolge aus. Die Reihenfolge kann zwischen unterschiedlichen Ausführungen abweichen, was für parallele Prozesse sichtbar sein kann.
  • Netzwerke: Nachrichten, die über das Netzwerk verschickt werden, können manchmal verloren gehen oder in unterschiedlicher Reihenfolge das Ziel erreichen.
  • Zeitabhängigkeit im Programm: Wenn die Programmlogik nicht für alle möglichen Sonderfälle ausgelegt ist, kann es sein, dass Fehler nur zu bestimmten Zeitpunkten passieren. Das passiert häufig in Schaltjahren, kann aber auch Wochentage betreffen, wie dieser kuriose Fehler, der nur an Mittwochen auftritt.

 

Sobald klar ist, welcher Umgebungsparameter das unterschiedliche Verhalten verursacht, ist man einen großen Schritt näher an der Behebung des Fehlers. Ist der Parameter kontrollierbar, kann sein Wert fixiert werden und der Fehler reproduziert werden, was herkömmliche Debugging Verfahren anwendbar macht. Zum Beispiel ist es in vielen Systemen möglich, die Systemzeit auf einen bestimmten Wert zu setzen. Auch wenn der Parameter nicht so leicht kontrollierbar ist, gibt es zumindest einen wertvollen Hinweis für die manuelle Fehlersuche.

 

Wie helfen mathematische Modelle?

 

Im Gegensatz zu Testverfahren betrachten formale Methoden nicht einzelne Ausführungen von Programmen, sondern beruhen darauf, ein komplettes Systemmodell zu untersuchen. Da alle möglichen Randfälle betrachtet werden, werden automatisch auch Heisenbugs entdeckt, die bei wiederholter Ausführung nur selten auftreten würden. Um wirklich nachzuweisen, dass ein Heisenbug vorliegt, müssen nicht nur einzelne fehlerhafte Ausführungen, sondern auch entsprechende korrekte Ausführungen betrachtet werden, was durch eine systematische Analyse des Models erleichtert wird. Auch für die Suche nach Ursachen müssen sowohl korrekte als auch fehlerhafte Ausführungen untersucht werden, um deren Unterschied festzustellen. Im nächsten Schritt gilt es festzustellen, welche der Unterschiede tatsächlich eine kausale Auswirkung auf das Auftreten des Fehlers haben. So kann es zum Beispiel sein, dass ein Programm mit einem Fehler, der nur in Schaltjahren auftritt, auch Nachrichten verschickt, die in unterschiedlichen Reihenfolgen auftreten. Die Reihenfolge der Nachrichten hat aber keinen Einfluss auf den Fehler. Liegt ein formal mathematisches Modell vor, können die tatsächlichen Ursachen mit Hilfe logischer Schlussfolgerungen bestimmt werden. Um formale Methoden erfolgreich einzusetzen, ist es ausschlaggebend, auf der einen Seite ausreichend detaillierte Modelle zu betrachten und auf der anderen Seite Analysemethoden zu entwickeln, die effizient genug sind, um mit großen und komplexen Modellen umzugehen.

Tags:

Heisenbugs Debugging Fornale Methoden

Sarah Sallinger

Profile picture for user sarah.sallinger

I am a PhD student in the Rigorous Systems Engineering group at TU Wien. I am driven by the desire to better understand the inner workings of complex computer systems and I want to develop tools that help in this process. My research interests broadly span the fields of computer aided verification, program analysis and automated bug detection and diagnosis.

Skills:

Programming
,
Formal Methods
,
Logic
CAPTCHA
Diese Frage dient der Überprüfung, ob Sie ein menschlicher Besucher sind und um automatisierten SPAM zu verhindern.
    Datenschutzinformation
    Der datenschutzrechtliche Verantwortliche (Internet Privatstiftung Austria - Internet Foundation Austria, Österreich) würde gerne mit folgenden Diensten Ihre personenbezogenen Daten verarbeiten. Zur Personalisierung können Technologien wie Cookies, LocalStorage usw. verwendet werden. Dies ist für die Nutzung der Website nicht notwendig, ermöglicht aber eine noch engere Interaktion mit Ihnen. Falls gewünscht, können Sie Ihre Einwilligung jederzeit via unserer Datenschutzerklärung anpassen oder widerrufen.