Frage

Ich weiß, dass E & C ist ein umstrittenes Thema und einige sagen, dass es einen falschen Ansatz ermutigt zu debuggen, aber immer noch - ich denke, wir können vereinbaren, dass es zahlreiche Fälle, in denen es eindeutig sinnvoll ist - mit unterschiedlichen Werten einiger Konstanten zu experimentieren, GUI Parameter neu zu gestalten on-the-fly einen guten Blick zu finden ... Sie nennen es.

Meine Frage ist: Sind wir jemals gehen E & C auf GDB haben Ich verstehe, dass es sich um eine plattformspezifische Funktion und muss einige ernsthafte Zusammenarbeit mit dem Compiler, Debugger und OS (MSVC hat diese eine einfach wie die Compiler und Debugger immer in einem Paket kommen) , aber ... Es soll noch machbar sein. Ich habe sogar etwas über Apple gehört, dass es in ihrer Version von GCC [Bearbeiten] umgesetzt mit . Und ich würde sagen, dass es in der Tat möglich ist.

Zu wissen, all den Hype um MSVC der E & C (meine Erfahrung sagt, es ist das erste, was MSVC Benutzer erwähnen, wenn Sie gefragt „warum nicht auf Eclipse-Schalter und gcc / gdb“ ), bin ich ernsthaft überrascht, dass nach ganz einige Jahre GCC / GDB noch nicht über eine solche Funktion. Gibt es gute Gründe dafür? Ist jemand arbeitet daran, wie wir sprechen?

War es hilfreich?

Lösung

Es ist eine überraschend nicht-triviale Menge an Arbeit, viele Design-Entscheidungen und Funktion Kompromisse umfasst. Bedenken Sie: Sie debuggen. Die debugee ausgesetzt. Sein Bild im Speicher enthält den Objektcode der Quelle, und das binäre Layout von Objekten, die Halde, die Stapel. Der Debugger inspiziert seine Speicherbild. Es hat geladene Debug-Informationen über die Symbole, Typen, Adresszuordnungen, pc (ip) an Quelle Korrespondenzen. Es zeigt den Call-Stack, Datenwerte.

Jetzt wollen Sie den Code und / oder Daten, die einem bestimmten Satz von möglichen Änderungen zu ermöglichen, ohne die Debuggee zu stoppen und neu zu starten. Am einfachsten könnte sein, eine Zeile Code zu einem anderen zu wechseln. Vielleicht neu kompilieren Sie die Datei oder nur die Funktion oder einfach nur diese Zeile. Nun müssen Sie das Debuggee Bild Patch, der neue Codezeile auszuführen, um das nächste Mal, wenn Sie über es betreten oder anderweitig durch sie laufen. Wie funktioniert das unter der Haube? Was passiert, wenn der Code größer als die Codezeile ist es ersetzt? Wie funktioniert es interact mit Compiler-Optimierungen? Vielleicht können Sie nur die für EnC Debug-Ziel auf eine speziell zusammengestelltes tun. Vielleicht werden Sie mögliche Fundstellen einschränken es legal zu EnC ist. Bedenken Sie: was passiert, wenn Sie eine Zeile Code in einer Funktion bearbeiten in den Call-Stack suspendiert unten. Wenn der Code gibt es nicht es die ursprüngliche Version der Funktion oder die Version mit Ihrer Linie geändert laufen? Wenn die ursprüngliche Version, woher kommt diese Quelle aus?

Können Sie hinzufügen oder entfernen Einheimischen? Was macht, dass an den Call-Stack von abgehängten Frames? Die aktuellen Funktion?

Können Sie Funktionssignaturen ändern? Felder hinzufügen / entfernen Felder aus Objekten? Was über bestehende Instanzen? Was ist Destruktoren oder Finalizers anhängig? Etc.

Es gibt viele, viele Funktionen Details kümmern sich um jede Art von usuable EnC Arbeit zu machen. Dann gibt es viele Quer Tools Fragen der Integration notwendig, um die Infrastruktur an der Macht EnC zur Verfügung zu stellen. Insbesondere hilft es, eine Art von Repository von Debug-Informationen zu haben, das vor-verfügbar und After-bearbeiten Debug-Informationen und Objektcode in den Debugger machen. Für C ++, hilft die inkrementell aktualisierbar Debug-Informationen in PDBs. Inkrementelle Verknüpfung kann auch helfen.

von den MS Suche Ökosystem über in das GCC-Ökosystem, ist es einfach, die Komplexität und Integrationsfragen über GDB / GCC / binutils, mich vorzustellen, die Vielzahl von Zielen, einig benötigte EnC spezifisches Ziel Abstraktionen, und die „schön zu haben, aber unwesentliche“Natur EnC werden, warum es noch nicht in GDB / GCC erschienen.

Happy Hacking!

(ps Es ist lehrreich und inspirierend zu schauen, was die Smalltalk-80 interaktive Programmierumgebung tun konnte In ST80 gibt es kein Konzept des „Neustart“ -. Das Bild und seine Objektspeicher waren immer zu leben, wenn Sie bearbeiten Aspekt einer Klasse, die Sie noch zu halten hatte ausgeführt wird. In solchen Umgebungen objekt~~POS=TRUNC keine hypothetische war.)

Andere Tipps

Ich bin nicht vertraut mit MSVC der E & C, aber GDB hat einige der Dinge, die Sie erwähnt haben:

http://sourceware.org/gdb/current/onlinedocs /gdb/Altering.html#Altering

  

17. Ändern Ausführung

     

Wenn Sie denken, Sie einen Fehler in Ihrem Programm gefunden haben, könnten Sie für bestimmte wissen mögen, ob die offensichtlichen Fehler zu korrigieren, um einen korrekten Ergebnisse in dem Rest des Laufes führen würde. Sie können die Antwort durch das Experiment finden, die gdb Funktionen mit der Ausführung des Programms zur Veränderung.

     

Zum Beispiel können Sie speichern die neuen Werte in Variablen oder Speicherplatz, geben Sie Ihr Programm ein Signal, starten Sie ihn an einer anderen Adresse oder sogar vorzeitig Rückkehr aus einer Funktion.

     

Zuordnung : Zuordnung zu Variablen
   Jumping : Weiter an einer anderen Adresse
   Signaling : Geben Sie Ihrem Programm ein Signal
   Rückkehr : Rückkehr von einer Funktion
   Der Aufruf : Aufruf Ihres Programms Funktionen
   Patchen : Patchen Ihr Programm
   Compilieren und Einspeisen-Code : Kompilieren und Injizieren Code in GDB

Dies ist ein ziemlich guter Hinweis auf die alte Apple-Implementierung von „fix und weiter“. Es bezieht sich auch auf andere Arbeits-Implementierungen.

http://sources.redhat.com/ml/gdb/ 2003-06 / msg00500.html

Hier ist ein Ausschnitt:

  

Fix und weiterhin ist eine Funktion von vielen anderen Debugger implementiert,   , die wir hinzugefügt für diese Version in unsere gdb. Sun Workshop, SGI ProDev   WorkShop, Microsoft Visual Studio, HP WDB und Sun Java Hotspot   VM bieten all diese Funktionen in der einen oder anderen. Ich Basis unserer   Implementierung auf dem HP wdb Fix und Weiter-Funktion, die sie   ein paar Jahre zurück versetzt. Obwohl meine endgültige Umsetzung folgt die   Grundzüge des Ansatzes sie nahmen, ist es so gut wie keine gemeinsamen   Code zwischen ihnen. Ein Teil davon ist aufgrund der architectual   Unterschiede (sowohl der Prozessor und das ABI), aber noch mehr davon ist   aufgrund Implementierung Design Unterschiede.

Beachten Sie, dass diese Fähigkeit in einer späteren Version ihrer Toolkette entfernt worden sein.

UPDATE: Dec-21-2012 Es gibt eine GDB Roadmap PDF-Präsentation, die eine Folie umfasst „Fix and Continue“ unter anderem Aufzählungspunkte beschreibt. Die Präsentation ist Juli-9-2012 vom so vielleicht gibt es Hoffnung, das an einem gewissen Punkt hinzugefügt zu haben. Die Präsentation war Teil der GNU-Tools Cauldron 2012 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top