Ich habe nie einen Debugger verwendet, der ein Programm rückwärts ausführen kann, aber ich würde es gerne tun. Jetzt frage ich mich, ob es viele Beweise und Theorien zur rückwärts laufenden Programmierung gibt, wann und warum ein Programm rückwärts ausgeführt werden kann oder wann und warum nicht?
Intuitiv finde ich, dass der Computer in der Lage sein sollte, das Programm rückwärts auszuführen, wenn er das Programm einmal vorwärts ausgeführt hat und weiß, dass das Programm rückwärts ausgeführt wird, wodurch Zustände des Programms gespeichert werden, die andernfalls verloren gehen und freigegeben werden könnten.
Das Debuggen ist nur ein praktisches Beispiel. Ich interessiere mich auch für die Theorie der Reversibilität. Wenn das Programm rückwärts ausgeführt werden kann, ist das, was das Programm tut, reversibel, nicht wahr?
quelle
Antworten:
Um das Programm tatsächlich rückwärts auszuführen, müssten Sie theoretisch alle Auswirkungen der Programmausführung rückgängig machen. Dies sollte für Speicheränderungen relativ einfach, wenn auch ineffizient, für Änderungen auf der Festplatte schwieriger und für das Netzwerk unmöglich sein. Und wenn der Code von einem externen Status abhängt (Tageszeit, Datei auf der Festplatte, die durch einen anderen Prozess geändert werden könnte), führt das Zurückspulen und erneute Ausführen nicht zum gleichen Ergebnis.
In der Praxis , was möglich ist, damit Sie schauen auf dem Zustand des Programms an einem gewissen Punkt in der Ausführung, aber ohne dass Sie von diesem Punkt aus neu zu starten. Auf diese Weise gibt es keine Probleme mit dem externen Status, da bei dieser Form des Zurückspulens keine Statusänderungen rückgängig gemacht werden müssen (mit Ausnahme des Speichers) und ein Vorwärtsschritt immer das gleiche Ergebnis liefert (da der Code nicht erneut ausgeführt wird). Diese Form des Zurückspulens wird in Visual Studio unter dem Namen Historical Debugging implementiert , obwohl der Programmstatus nicht bei jeder Anweisung oder Codezeile, sondern nur bei jedem Methodenaufruf aufgezeichnet wird.
quelle
Es gibt viel Forschung zu diesem Thema. Ich habe es in der Literatur manchmal als "Zeitreise-Debugging" bezeichnet, manchmal als "Reverse-Debugging". Ein paar Minuten bei Google Scholar sollten eine Reihe von Forschungspublikationen zu diesem Thema auftauchen.
Siehe auch https://softwareengineering.stackexchange.com/q/181527/34181 und https://stackoverflow.com/q/1470434/781723 .
quelle