Warum wird das Reverse-Debugging selten verwendet? [geschlossen]

56

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:

Philipp Claßen
quelle
47
Was ist Reverse-Debugging für diejenigen, die nicht wissen, dass es es gibt ?
Mason Wheeler
5
MS bezeichnete ihre Systemintelligenz als ähnlich wie das, was Sie Revese Debugging nennen. Je nach Umgebung kann es sich um mehrere Namen handeln, so dass sie weniger gebraucht erscheinen.
Ryathal
1
Nur für das, was es wert ist: Es ist wirklich viel älter als Sie denken - Microsoft hat es in QuickC unterstützt (um 1989 oder '90, wenn Speicher zur Verfügung steht).
Jerry Coffin
41
@ MasonWheeler, klares Reverse Debugging ist das Hinzufügen von Fehlern zum Code. Ich bin mit der Prämisse des OP nicht einverstanden, dass dies eine ungewöhnliche Praxis ist.
Ben Lee
3
@BenLee, wir nennen das Rebugging.
OldFart

Antworten:

26

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 finallyBlö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.

Ratschenfreak
quelle
1
Sehr gute Antwort. Ich kann bestätigen, dass die Aufnahme teuer ist. Sie müssen es erst aktivieren, bevor Sie den kritischen Teil Ihrer Anwendung betreten, was nicht immer trivial ist. Ich stimme auch zu, dass "Drop to Frame" oft gut genug ist. Es funktioniert jedoch nicht gut mit Schleifen oder rekursiven Algorithmen.
Philipp Claßen
2
Das ist bis rr ( rr-project.org ). Die Geschwindigkeit beim Aufzeichnen einer Ausführung mit rr ist kaum langsamer. Sie können den Code dann in Ihrer bevorzugten IDE ( github.com/mozilla/rr/wiki/Using-rr-in-an-IDE ) erneut abspielen, einsteigen, zurückspulen und Beobachter einstellen gleich.
Jyavenard
11

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.

user1839284
quelle
1
Interessant, ich werde es auf jeden Fall ausprobieren. In mehreren Artikeln wird angegeben, dass es für die nichtkommerzielle Nutzung kostenlos ist, aber ich habe keine Informationen gefunden, die dies auf Ihrer Homepage bestätigen. Ist es noch wahr Vielen Dank für die Offenlegung Ihrer Zugehörigkeit.
Philipp Claßen
2
Was sind die Preise für die Starter- und Professional-Versionen von UndoDB? Ich sehe sie nicht auf der Seite mit den UndoDB-Editionen.
Tcrosley
3
Wie seid ihr im Vergleich zu Mozilla rr?
Ciro Santilli
10

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.

jakobengblom2
quelle
4

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.

SebGR
quelle
4
Ich denke, es wäre weitaus besser, diese Studie zu verknüpfen, als 'Undo Software'-Spam, der vorgibt, über das Studium zu handeln.
Bulwersator
1
In meinem früheren Job habe ich einen Reverse-Debugger ( ghs.com/products/timemachine.html ) erstellt. Wir haben den Debugger intern stark genutzt, und ich kann Ihnen sagen, es war unglaublich. Natürlich war es großartig auf den wirklich haarigen Rennbedingungen, aber es war mehr als das. Wenn das Reverse-Debugging ständig aktiviert ist, ändert sich Ihre Einstellung zum Debuggen. Sie iterieren weniger und können weniger vorsichtig sein, wie Sie Ihren Code testen. Sie können einen Ausführungslauf auch speichern und an eine andere Person senden, um Fehler im Code anderer Personen zu finden.
Speedplane
2

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.

AndreasScheinert
quelle