Wie kann ich im Eclipse-Debugger einen Schritt zurücktreten?

129

Ist es möglich, im Eclipse-Debugger eine umgekehrte Ausführung durchzuführen? Das aktuelle Projekt, an dem ich arbeite, benötigt mindestens 5 Sekunden, um Daten aus einer Datei zu lesen und zu initialisieren, bevor etwas getan werden kann. Wenn ich den Debugger überschreite, muss ich das Programm beenden und neu starten, was einige Zeit in Anspruch nimmt.

Jason
quelle

Antworten:

136

Mit dem Befehl drop to frame von Eclipse können Sie die aktuelle Methode von oben erneut eingeben. Es werden jedoch keine aufgetretenen Statusänderungen abgewickelt, sodass es je nach Art der Methode, in der Sie sich befinden, möglicherweise nicht funktioniert.

Ein weiteres wirklich cooles Tool, mit dem Sie rechtzeitig vor- und zurückgehen können, ist der Omniscient Debugger . Es funktioniert, indem Klassen instrumentiert werden, während sie in den Klassenladeprogramm geladen werden, sodass alles aufgezeichnet werden kann, was Ihr Code tut. Es kann sehr coole Dinge tun, wie die Antwort "Wann, wo und warum wurde diesem Feld der aktuelle Wert zugewiesen?". Die Benutzeroberfläche ist ziemlich klobig und es kann schwierig sein, mit großen Codebasen umzugehen, aber in einigen Fällen kann sie wirklich viel Zeit sparen.

Update : Chronon bietet ein kommerzielles Produkt an, das als "DVR für Java" bezeichnet wird und anscheinend viele der gleichen Aufgaben wie die ODB ausführt.

Matt McHenry
quelle
@ Matt McHenry Ich habe versucht, ODB1.5 zu verwenden; mit einem eigenständigen Java-Programm, aber ich bin nicht sicher, wie ich es zum Laufen bringen soll? Haben Sie andere Ressourcen als die ODB-Site, in der die Schritte erläutert werden, mit denen sie eigenständig und mit Eclipse funktioniert?
Ayusman
@ Ayusman: Nein, es tut mir leid, ich habe nichts zu teilen, außer was auf der ODB-Site steht. Es würde mich nicht wundern, wenn es unter anderem nicht mit neueren .class-Dateiformaten funktioniert. :(
Matt McHenry
Interessante Antwort!
KrishPrabakar
Es scheint, dass die Omnscient Debugger-Website domänenübergreifend ist.
Thorbjørn Ravn Andersen
45

Über das hinaus, was in früheren Antworten erwähnt wurde - dh die Drop-to-Frame-Funktion von Eclipse in der Debug-Ansicht , die das Debuggen früher im Stack-Frame neu startet (aber keine globalen / statischen Daten zurücksetzt ), und der Omniscient-Debugger , der etwas roh und nicht so sehr ist Weiterentwicklung - Es gibt einige Eclipse-basierte Tools, mit denen Sie in der (Laufzeit-) Zeit "zurückkehren" können:

JIVE erweitert den Eclipse Java-Debugger um die Möglichkeit, die Programmzustände aufzuzeichnen. Die JIVE-Perspektive bietet einige nützliche UML-Diagramme, die während der Ausführung des Programms aktualisiert werden. Diese Diagramme geben einen Überblick über den Status der Anwendung (Objektdiagramm) und der Stapelverfolgung (Sequenzdiagramm). Sie können die gespeicherte Ablaufverfolgung abfragen und rechtzeitig vor- und zurückgehen und die entsprechenden Diagramme anzeigen.

Diver zeichnet nur Methodenaufrufe auf und zeichnet Programmzustände wie JIVE nicht wirklich auf. Jedes Methodenaufrufereignis wird zum späteren Abrufen und Analysieren gespeichert. Es erweitert die Java Run- und Debug-Konfigurationen hauptsächlich, um Filter anzugeben. Der Trace kann zur Laufzeit angehalten / fortgesetzt / gefiltert werden. Einmal aufgenommen, kann die Taucherperspektive es in einem interaktiven Sequenzdiagramm anzeigen.

JIVE und Diver sind Open-Source-Projekte aus der akademischen Forschung. Ab November 2012 sind beide Projekte aktiv.

Chronon ist ein kommerzielles Produkt, aber sie haben kostenlose Lizenzen für Studenten und Open Source-Projekte. Nach dem, was auf ihrer Website behauptet wird, ist es wahrscheinlich der umfassendste Rekorder, da er in der Lage ist, den aufgezeichneten Verlauf wiederzugeben, hin und her zu gehen und so das Debuggen auf Zeitreise zu ermöglichen. Auch Eclipse wird für die Aufnahme nicht benötigt.

Alle diese Plugins sind ziemlich ressourcenschonend, daher ist es am besten, eine gute Spezifikationsmaschine zu haben und ihre Filterfunktion zu verwenden. Eine eindeutige Voraussetzung für eine erfolgreiche Ausführung ist die Erweiterung des Heap-Speicherplatzes in eclipse.ini .

In meinem Fall habe ich versucht, mit JIVE und Diver ein XML-Parsing-Programm zu debuggen, aber aufgrund fehlender Ressourcen die Eclipse immer eingefroren. Es könnte schwierig sein, Diver unter Linux 64- Bit zu betreiben. Mit diesen Tipps funktioniert es unter Ubuntu 32-Bit und möglicherweise anderen 32-Bit-Distributionen . Diver funktioniert unter Windows, besser noch unter Windows 64-Bit + 64-Bit-JVM. Andernfalls sind Sie auf einen maximalen Heap-Speicherplatz von 1,3 bis 1,6 GB unter 32-Bit-Fenstern beschränkt . JIVE funktioniert hervorragend unter meinem 64-Bit-Linux und scheint auf anderen Plattformen einwandfrei zu funktionieren.

fmjrey
quelle
Taucher wurde eingestellt
merours
12

Ja , Eclipse CDT unterstützt die Funktion für historische Debugger.

Öffnen Sie die Debug-Konfiguration -> Debugger -> Reverse Debugging beim Start aktivieren .

Dann können Sie drücken shift+F5oder shift+F6für einen Schritt zurück wie F5oder F6für einen Schritt vorwärts.

Sergei
quelle
1
Gibt es diese Option in allen Versionen von Eclipse? Ich bin fertig, wenn ich es irgendwo finden kann.
EngineerBetter_DJ
1
Die GDB-Funktion sourceware.org/gdb/wiki/ReverseDebug , die in Eclipse von dieser Anforderung von bugs.eclipse.org/bugs/show_bug.cgi?id=258284 unterstützt wird . Nun, ich nehme an, die Antwort ist ja seit 2009.
Sergei
Es ist in CDT zugänglich.
Sergei
Ich bin ein Java-Entwickler, also schätze ich, dass CDT für mich nicht viel bringt?
EngineerBetter_DJ
@ Sergei Ich mache dies unter Windows 7 SP1 mit einer alten Springsource-Version. Um das Reverse-Debugging zu aktivieren, müssen Sie zuerst als-> Debug-Konfigurationen-> Main debuggen. Am Ende der Seite befindet sich der Prozessstarter. Es wird "Using Standard Create Process Launcher" angezeigt und es wird ein Hyperlink zu "Select other ..." angezeigt. Klicken Sie darauf und stellen Sie sicher, dass "Konfigurationsspezifische Einstellungen verwenden" aktiviert ist. Wählen Sie dann "GDB (GSF) Create Process Launcher" aus und klicken Sie auf "OK". "Verwenden des GDB (GSF) Create Process Launcher" wird jetzt unten auf der Hauptregisterkarte angezeigt.
Sammy
5

Ich bin voreingenommen, aber Chronon macht genau das, wonach Sie suchen.

Drop to Frame tritt nicht genau zurück, da die Methode, wenn sie etwas auf dem Heap geändert hat, nicht zurückgesetzt wird.

pdeva
quelle
1
Ermöglicht Chronon dies in Echtzeit? Mein Verständnis ist, dass Sie zuerst eine Sitzung mit Chronon aufzeichnen müssen und dann möglicherweise in dieser Sitzung zurücktreten können. Ist das nicht so gut wie ein Neustart der Anwendung? Oder vielleicht fehlt mir etwas ..
Raam
2
Ja, Sie müssen Ihre Anwendung zuerst aufzeichnen und können sie anschließend jederzeit nach der Aufzeichnung debuggen. Es unterscheidet sich vom Neustart der Anwendung, da Sie nicht alle Schritte ausführen müssen, um den Fehler zu reproduzieren. Alles, was Sie tun, ist, den Fehler einmal aufzuzeichnen, und dann können Sie ihn jederzeit anzeigen, wenn Sie nur mit der Aufzeichnung debuggen möchten. Sie benötigen keinen Teil der ursprünglichen Umgebung, um die Aufnahme abzuspielen.
Pdeva
Funktioniert Chronon in einer Docker-Umgebung? Meine Eclise ist nicht auf der lokalen ..
Choi
3

Ich habe diese Funktion auch in Eclipse gesucht. Ich weiß, dass das visuelle Studio das kann. Tatsächlich können Sie die aktuelle Linienmarkierung ziehen und an einer beliebigen Stelle im Code ablegen. Ich bin mir nicht sicher, ob die Änderungen an Variablen rückgängig gemacht werden können. Trotzdem ist es sehr nützlich und spart viel Zeit. Ich habe sehr lange in Eclipse darauf gewartet.

Bruno VA Pinheiro
quelle
1

Die Frage gibt keine Eclipse-Sprache an, und viele der Antworten setzen Java voraus.

Wenn Sie C ++ und GCC mit dem GDB-Debugger verwenden, hat Eclipse Run->Move to Linedie Aufgabe und funktioniert wie die Visual Studio Set Next-Anweisung . In diesem Fall verwendet Eclipse die in GDB enthaltene Funktion.

Wenn Sie Java verwenden, ist mir kein Weg mit Eclipse oder Netbeans bekannt, obwohl andere Antworten Plugins vorgeschlagen haben. Eclipse verfügt über den Befehl "Drop to Frame", der in meiner Version (Juno SR1) für Java funktioniert. Wenn ich Code innerhalb einer Funktion im Debug-Modus ändere und speichere, wird die Ausführungszeile automatisch an den Anfang der aktuellen Funktion verschoben und ich kann von dort aus fortfahren. Nicht dasselbe wie die Angabe der Zeile, aber es ist etwas.

SchwerkraftWell
quelle