2009-05-13 28 views
15

Wie funktioniert das Setzen von Haltepunkten in Java? Basiert es nur auf dem Quelldateinamen und der Zeilennummer? Ist der Klassen- oder Methodenname auch in?Setzen von Haltepunkten in Java

Wenn ich eine alte Version der Quelle in meinem Debugger habe und einen Haltepunkt gesetzt habe, ist der Cursor ausgeschaltet, wenn ich durchgehe. Wie weit kann es sein? Kann es in die falsche Methode (oder sogar die falsche Klasse, wenn es mehr als eine Klasse in dieser Datei gibt) gehen?

Was passiert, wenn mehrere Klassen desselben Namens in der JVM vorhanden sind (kann passieren, wenn Sie mehr als einen Klassenlader haben)? Erhalten sie alle den Haltepunkt?

Kann ich in einem Webanwendungscontainer Haltepunkte für nur eine Webanwendung (und nicht die anderen) festlegen?

Wie viel davon ist IDE-spezifisch und wie viel wird durch die Debugging-Schnittstelle bestimmt, die die JVM bietet? Zum Beispiel: In Eclipse kann ich bedingte Haltepunkte basierend auf den Werten von Variablen setzen. Wird das Filtern von Eclipse nur an einem unbedingten Haltepunkt in der JVM durchgeführt?

+0

Ich denke wirklich, dass Sie hier mehr IDE-spezifisch sein müssen. –

+0

Verwenden nicht alle IDE die gleiche Debugger-Schnittstelle wie die JVM? – Thilo

Antwort

13

Es gibt verschiedene Arten von Haltepunkten. Einige Breakpoints sind linienbasiert, andere nicht. Wie sich dies auf Ihr tatsächliches Debugging auswirkt, hängt davon ab, was Ihre IDE tatsächlich tut. Wenn Sie beispielsweise in Eclipse einen Haltepunkt in der Mitte einer Methode hinzufügen, handelt es sich um einen zeilenbasierten Haltepunkt. Wenn Sie einen Haltepunkt in einer Zeile hinzufügen, die die Signatur einer Methode enthält, handelt es sich um einen Methodeneintragshaltepunkt.

Wenn der Quellcode, den Sie betrachten, nicht die genaue Quelle der Klasse ist, die ausgeführt wird, wird ein Zeilenumbruchpunkt natürlich nicht auf die rechte Zeile abgebildet. Also hört Java vielleicht nicht bei der von Ihnen beabsichtigten Linie auf, und Ihre IDE könnte Ihnen tatsächlich die falsche Methode oder sogar die falsche Klasse zeigen. Ein Methodeneintrag-Haltepunkt funktioniert jedoch immer noch (stoppt im richtigen Moment), selbst wenn die Zeile, für die die Methode definiert wurde, geändert wurde. aber wieder könnte eine IDE die falsche Zeile im Debugger anzeigen. (Und es gibt auch andere Arten von Ereignissen/Breakpoints, wie das Laden von Klassen, ... Sie können sich die Subschnittstellen von EventRequest ansehen, wenn Sie mehr über die Interna erfahren wollen).

Um Ihre andere Frage zu beantworten: Haltepunkte gelten für alle Klassenlader in der JVM.

6

Die JVM unterstützt eine Standard-API für das Debugging (siehe Java Platform Debugger Architecture), und alle IDEs verwenden JPDA, um alle schweren Aufgaben wie das Setzen von Haltepunkten, das Berechnen von Ausdrücken usw. auszuführen. Die IDEs "wickeln" sie einfach in netten Benutzeroberflächen ein.

Wenn Sie einen Haltepunkt setzen, spricht die IDE mit der Werkzeugschnittstelle der JVM (Teil von JDPA) und gibt ihr die Quelldatei und Zeilennummer des Haltepunkts. Die JVM verfügt über die Informationen, die sie benötigt, um den physischen Speicherort des Haltepunkts auf den tatsächlichen Speicherort der Java-Anweisung im kompilierten Code der Klasse zuzuordnen. Wenn die JVM einen Haltepunkt erreicht, beendet sie die Ausführung dieses Threads und teilt der IDE die Quelldatei und die Zeilennummer des Haltepunkts mit. Die IDE zeigt Ihnen dann den Speicherort an.

Wenn ich debugge ich manchmal Zeilen hinzufügen oder löschen, um ein Problem zu beheben, und dann weiter mit dem nächsten Problem. Aber die Dinge werden seltsam, weil Breakpoints jetzt früher oder später erscheinen, als ich es erwartet habe, und wenn ich neue Breakpoints setze, sind sie nicht an der Quelle, auf die ich sie gesetzt habe. Wenn das passiert, starte ich das Programm neu und dann sind sowohl die IDE als auch die JVM wieder konsistent.

Verwandte Themen