gdb hat 2009 die Unterstützung für das Reverse Debugging implementiert (mit gdb 7.0). Ich habe erst 2012 davon gehört. Jetzt finde ich es für bestimmte Arten von Debugging-Problemen äußerst nützlich. Ich wünschte, ich hätte schon mal davon gehört.
Korrigieren Sie mich, wenn ich falsch liege, aber ich habe den Eindruck, dass die Technik immer noch selten angewendet wird und die meisten Leute nicht wissen, dass sie existiert. Warum?
Kennen Sie Programmier-Communities, in denen Reverse-Debugging üblich ist?
Hintergrundinformation:
- Stackoverflow: Wie funktioniert das Reverse Debugging?
- gdb verwendet den Begriff "Reverse Debugging", andere Anbieter verwenden jedoch andere Begriffe für identische oder ähnliche Techniken:
- Microsoft nennt es IntelliTrace oder "Historical Debugging"
- Es gibt einen Java-Reverse-Debugger namens Omniscient Debugger , der in Java 6 wahrscheinlich nicht mehr funktioniert
- Es gibt andere Java-Reverse-Debugger
- OCamls Debugger (ocamldebug) nennt es Zeitreise
Antworten:
Zum einen ist die Ausführung im Debug-Modus mit aktivierter Aufzeichnung im Vergleich zum normalen Debug-Modus sehr teuer. es verbraucht auch viel mehr Speicher.
Es ist einfacher, die Granularität von Zeilenebene zu Funktionsaufrufebene zu verringern. Mit dem Standard-Debugger in Eclipse können Sie z. B. "Drop to Frame" ausführen. Dies ist im Wesentlichen ein Rücksprung zum Start der Funktion mit einem Zurücksetzen aller Parameter (nichts auf dem Heap wird zurückgesetzt, und
finally
Blöcke werden nicht ausgeführt.) Es handelt sich also nicht um einen echten Reverse-Debugger.Beachten Sie, dass dies bereits seit mehreren Jahren verfügbar ist und mit dem Ersetzen von Hot-Code einhergeht.
quelle
Wie bereits erwähnt, ist die Leistung entscheidend, z. B. beim reversiblen Debugging von gdb. Bei der Ausführung von gzip ist eine Verlangsamung um das 50.000-fache im Vergleich zur nativen Ausführung zu verzeichnen. Es gibt jedoch kommerzielle Alternativen: Ich arbeite für Undo undo.io , und unser UndoDB-Produkt macht dasselbe, jedoch mit einer Verlangsamung von weniger als 2x. Es gibt auch andere kommerzielle reversible Debugger.
quelle
rr
?Eine Übersicht über die Auswahl an Technologien und Produkten finden Sie in einer Reihe von Blog-Beiträgen, die ich vor etwa einem Jahr verfasst habe (und einige Follow-ups seitdem):
Mein Gefühl dafür, warum es so wenig genutzt wird, ist, dass es spezielle Hardware erfordert oder einen speziellen Debugger verwendet oder Ihr System richtig einrichtet. Leider investieren die meisten Leute nicht die Zeit, um den größtmöglichen Nutzen aus ihren Debug-Tools zu ziehen.
Und die Tatsache, dass der "billige Standard" von gdb fast unbrauchbar langsam ist und für alles andere als die gängigsten Zielsysteme einige Stabilitätsprobleme aufweist.
quelle
Aus meiner Erfahrung als Vertriebsingenieur für TotalView-Debugger wissen die Leute, dass es existiert, aber sie glauben nicht, dass es funktioniert, ungeachtet der (akzeptablen oder nicht akzeptablen) Verlangsamung.
Die University of Cambridge hat kürzlich eine Umfrage mit dem Titel "Misserfolg der Einführung von Reverse-Debugging-Kosten in Höhe von 41 Mrd. USD pro Jahr in der Weltwirtschaft" durchgeführt .
Als ich auf GDB zurückkam, habe ich (viel) gehört, dass die Verlangsamung es in einer "echten" Anwendung ziemlich unbrauchbar macht.
Ich persönlich würde gerne von mehr Leuten hören, die das Reverse-Debugging für andere Anwendungen als "Hallo Welt!" Verwenden.
quelle
Ich denke, es ist wichtig, dieses "umgekehrte" oder "historische" Debuggen ein wenig weiter auszubauen. Ich denke, komplexe Systeme und Verhaltensweisen darin zu verstehen, "Ereignisse", die den Zustand explizit machen, wiederzugeben, ist absolut entscheidend.
Was ich zum Ausdruck bringen möchte, ist, dass Sie sich nicht allein fragen, warum diese Technik heute nicht so häufig angewendet wird oder warum die damit verbundenen Probleme selten klar diskutiert werden.
Lassen Sie uns hier zwei sehr wichtige Konzepte hervorheben:
1. Um ein Programmiersystem zu verstehen, ist es hilfreich, den Status explizit anzugeben
2.Um ein Programmiersystem noch besser zu verstehen, kann es sehr hilfreich sein, Abläufe von Zuständen (Ereignissen) wiederzugeben.
Hier sind einige Quellen, die sich mit dem Problem befassten und Lösungen für das Problem vorschlugen oder entwarfen (Umgang mit Zuständen in komplexen Systemen):
-Außerhalb des Teerbits, Papier: http://shaffner.us/cs/papers/tarpit.pdf Hauptideen : vermeiden, isolieren oder explizit angeben
-CQRS http://www.cqrs.nu/ Dies ist eine Kombination aus zwei Konzepten: Befehlsabfragesegregation und Ereignisbeschaffung. Es gibt verschiedene Implementierungen (Java, C #, Scala). Die Wiedergabe von Tate-Sequenzen und die Entwicklung eines Domänenmodells sind hier die entscheidenden Bestandteile.
Wenn Sie wirklich verkleinern und das sehr breite Bild sehen, können Sie bereits erkennen, dass Menschen mit dem "Aufstieg" der funktionalen Programmierung bereits (un) bewusst zu fp hingezogen werden, weil es den Status explizit macht! Aber das hat nur mit Punkt eins zu tun, um den zweiten anzusprechen, braucht man ein anderes Konzept, das man "lose" als funktionale reaktive Programmierung bezeichnen könnte.
Sie könnten also alles gut und schön sagen, aber wer nutzt eigentlich CQRS und FRP? Ich würde sagen (IMO, weil ich keine konkreten Zahlen habe), dass viele Unternehmen nur nicht wissen, welche Arbeit sie mit dieser Terminologie machen. Vielleicht googeln Sie ein bisschen und hören von Unternehmen, die CQRS verwenden, dass es bereits einige Erfolgsgeschichten gibt. Auch FRP steigt langsam an, als Beispiel könnte ich Netflix geben: http://techblog.netflix.com/2013/02/rxjava-netflix-api.html Was gerade eine Implementierung von RX herausgebracht hat, die tatsächlich auf .NET basiert (hat aber eine Javascript-Implementierung auch). Die Menschen nutzen diese Techniken bereits heute, um komplexe Systeme zu verstehen und sie noch besser zu machen. Deshalb verwenden sie Reverse-Debugging-Techniken.
quelle