Rolf B: Debugging - Programmdurchlauf aufnehmen?

Beitrag lesen

Hallo Toni,

Da das Programm mit Zufallswerten arbeitet, passieren diese Abweichungen auch zufällig - entsprechend ratlos bin ich, was das Debugging angeht - (ist tatsächlich Neuland für mich).

Solche Probleme entstehen typischerweise dann, wenn Funktionen oder Klassen zu groß und unübersichtlich werden, und die Abhängigkeiten zwischen den Teilen zu komplex sind.

Man kann hier nach schnellen Lösungen suchen, und den Code damit vermutlich noch weiter verkomplizieren, oder man kann versuchen, den Code zu strukturieren und möglichst zu zu verteilen, dass Zufallseffekte möglichst isoliert relevant sind.

Guter Code trennt I/O und Fachlogik, so dass man die Fachlogik Unittests unterziehen kann. Sprich: Ich kann definierte Eingaben hineingeben, und kann dann definierte Ausgaben erwarten. Ich kann dann einen Testtreiber schreiben, der die Funktion mit einer sinnvollen Menge an Eingabekombinationen aufruft, und dann validiert, ob die erwartete Ausgabe stattfindet.

Code unittestfähig machen ist nicht trivial. Schlüsselelement dafür ist maximale Entkoppelung, und die Fähigkeit, Abhängigkeiten zwischen Komponenten nicht in den Komponenten zu haben, sondern sie von außen, von einer Dirigentenkomponente, hineinzugeben (dependency injection). Sieht man das zum ersten Mal, erklärt man den anderen Programmierer für bekloppt. Sieht man dann aber, wie die Unittests wunderbar durchflutschen und kleine Fehlerchen sofort auffallen, ist man begeistert.

Altcode, der struppig gebaut ist, muss man dafür aber zumeist neu schreiben.

Um auf deinen bestehenden Code zurückzukommen: In Chrome gibt es in den Entwicklertools den Performance-Recorder. Der zeigt Dir zu jedem Zeitpunkt an, wie der Callstack ist, d.h. du siehst zumindest, wie die Funktionsaufrufe waren. Variableninhalte siehst Du nicht. Da hilft nur Logging in die Konsole, oder das Setzen von Breakpoints an den vermuteten Fehlerstellen.

Rolf

--
sumpsi - posui - obstruxi