Warum hat mein Eclipse-Projekt Phantom-Debugger-Haltepunkte?

74

Ich habe ein kleines Projekt, das beim Ausführen im Eclipse-Debugger immer in der Zeile 106 von FileInputStream.class anzuhalten scheint, in der Dateien geöffnet werden. Es sind keine Haltepunkte festgelegt, aber Eclipse verhält sich genau so, als hätte ich hier einen Haltepunkt. Wenn ich alle Haltepunkte lösche, passiert es immer noch.

Ich habe ein zweites viel größeres Projekt im selben Eclipse-Arbeitsbereich, das nicht unter diesem Problem leidet.

Ich habe gerade das kleinere Projekt von meinem alten Linux-Computer, auf dem ich es in Europa Eclipse entwickelt habe und das dieses Problem hatte, auf meinen neuen Windows-Computer verschoben, auf dem ich das Problem weiterhin in Ganymede Eclipse sehe. Das Problem besteht weiterhin zwischen Betriebssystemen und Eclipse-Versionen, jedoch offenbar nicht projektübergreifend. Ich verstehe es nicht! Ich habe jede Datei im Verzeichnis dieses Projekts durchsucht und konnte nichts finden, was eine Datei sein könnte, die Eclipse irgendwie anweist, in FileInputStream anzuhalten.

Weitere Informationen : Der scheinbare Haltepunkt gilt eigentlich nicht für Zeile 106 von FileInputStream. Es scheint sich um einen Ausnahme-Haltepunkt für FileNotFoundException zu handeln, der aus nativem Code ausgelöst wird, der in FileInputStream aus dieser Zeile aufgerufen wird. Aber auch hier scheinen mir überhaupt keine Haltepunkte gesetzt worden zu sein. Sind Ausnahme-Haltepunkte woanders definiert?

Skiphoppy
quelle
Ich habe mich selbst darüber gewundert. Oft halte ich an Haltepunkten an, von denen ich schwören konnte, dass ich sie entfernt habe.
Uri
Ich habe

Antworten:

113

Haben Sie versucht, die Auswahl aufzuheben?

Window > Preferences > Java > Debug : Suspend execution on uncaught exceptions

? (wie in diesem Thread erwähnt , zum Beispiel)

Alt-Text

Warum funktioniert Eclipse so?

Es geht auf das Jahr 2002 zurück , als die Haltepunktobjekthierarchie reduziert wurde.

Um einen Haltepunkt zu setzen, mit der alten API, benötigte ein Client - Java - Modell Objekte - wie IType, IFieldetc.
Mit der neuen API, die alle, die von dem Debug - Modell benötigt wird , ist Typname, Feldnamen, usw.

Auf diese Weise können Clients Haltepunkte festlegen, wenn Java-Modellobjekte nicht verfügbar sind.
Clients geben jetzt die Ressource an, der ein Haltepunkt zugeordnet werden soll (bevor wir ihn auf die zugeordneten Java-Modellressourcen beschränkt haben).

Haltepunkte können jetzt auch "ausgeblendet" werden . Das heißt, sie müssen nicht beim Haltepunktmanager registriert sein.
Haltepunkte können auch selektiv beibehalten werden (Markierungen erlaubten nur, dass alle / keine Markertypen beibehalten werden).
Dies macht das Debug-Modell flexibler und gibt Clients mehr Bausteine.

Dies hat auch einen Teil unserer Java-Debug-Implementierung vereinfacht - beispielsweise legt die Funktion " suspend on any uncaught exception" einfach einen Haltepunkt für den Typ " java.lang.Throwable" fest und nicht einen bestimmten ITypein einem bestimmten Projekt .
Der Haltepunkt ist nicht beim Haltepunktmanager registriert (dh ausgeblendet ) - er ist nur bekannt und wird von einem Client verwendet .
Ein weiteres Beispiel ist das " run to line breakpoint". Das IJavaRunToLineBreakpointwurde entfernt, da seine spezielle Funktionalität nicht mehr benötigt wird. Jetzt erstellt die Java-Debug-Benutzeroberfläche einfach einen "Zeilenumbruchpunkt", der ausgeblendet, nicht beibehalten und mit einer Trefferzahl von 1 versehen ist. Dies ist ein Beispiel für die Bereitstellung von Bausteinen für Clients.

VonC
quelle
Es hilft dabei, die ungeprüften Laufzeitausnahmen zu erkennen, die von Ihrem Code nicht erfasst werden.
VonC
Ich habe das gleiche Verhalten festgestellt und das Kontrollkästchen "Ausführung bei nicht erfassten Ausnahmen aussetzen" nicht deaktiviert. Ich lasse die Option lieber aktiviert, möchte aber wissen, welche Ausnahme aufgetreten ist. Wie kann ich das wissen?
HAL9000
@ HAL9000 Wenn Sie diese Option aktiviert lassen, sollten Sie dann nicht sehen, welche Ausnahme auftritt? Meinen Sie mit "Ich begegne dem gleichen Verhalten" "Phantom" -Halbpunkte?
VonC
Ja, ich meine Phantom-Haltepunkte. Manchmal wird in einer bestimmten Zeile ein Phantom-Haltepunkt ausgelöst. Weder LogCat noch Console sagen jedoch etwas über Ausnahmen aus. Auch der Code scheint ausnahmefrei zu sein, dann habe ich mich gefragt, wo ich nach einer Ausnahmemeldung suchen soll.
HAL9000
@ HAL9000 Vielleicht bricht es bei einem alten Build-Code mit darin enthaltenen Debug-Informationen aufgrund einer unsachgemäßen Bereinigung zusammen? Können Sie das Problem reproduzieren, wenn Sie Ihr Projekt aus Ihrem Eclipse-Arbeitsbereich löschen, die Quelle an eine andere Stelle kopieren und das Projekt aus den kopierten Quellen wieder in Ihren Eclipse-Arbeitsbereich importieren?
VonC
37

Ich hatte ein ähnliches Problem, aber die akzeptierte Lösung funktionierte bei mir nicht. Ich mache Eclipse Android-Entwicklung und hatte einige Haltepunkte gesetzt und später deaktiviert. Obwohl ich sie deaktiviert habe, hat Eclipse die Ausführung an diesen Phantom-Haltepunkten immer wieder gestoppt. Die Lösung für mich war, das Fenster Haltepunkte zu öffnen:

Fenster> Ansicht anzeigen> Andere ...

Debug> Haltepunkte

Klicken Sie dann mit der rechten Maustaste auf einen Haltepunkt und wählen Sie "Alle entfernen".

Leider müssen Sie alle gültigen Haltepunkte zurücksetzen, aber das hat bei mir funktioniert und viel Angst und Frustration in Zukunft verhindert.

Einige Bilder als Leitfaden für andere:

Fenster Haltepunkte zu Eclipse hinzufügen

Alle entfernen (Haltepunkte, Rechtsklick)

Mark Scheel
quelle
Danke, Mark. Das hat geholfen. Aber ich habe sie nicht alle entfernt, sondern nur die gefunden, die Probleme verursacht hat.
Morphium
Danke Mark! Hat für mich gearbeitet, aber wie der Typ oben habe ich nur den entfernt, den ich brauchte. Es ist frustrierend, dass ein registrierter Haltepunkt nicht einmal in der Editoransicht in der Seitenleiste angezeigt wird. In diesem Fall sind sie wirklich "Phantompunkte".
The111
Möglicherweise habe ich die Lösung für das Problem im Zusammenhang mit Ihrer Problemumgehung gefunden. Wenn es das nächste Mal passiert, versuche meine Lösung unten.
HAL9000
Wie schade, dass wir 2020 immer noch unter diesem schrecklichen Fehler leiden. Beachten Sie, dass die Frage älter als 11 Jahre ist. Jedes Mal, wenn ich eine Quelldatei bearbeite, muss ich alle meine Haltepunkte entfernen. Dies macht die gesamte IDE unbrauchbar.
Pere
5

Für diejenigen, die andere Lösungen nicht nützlich finden, habe ich meine persönliche Lösung für mein Problem gefunden. Ich arbeite mit einer .jar-Bibliothek, die durch Einfügen eines anderen Projekts in den Arbeitsbereich generiert wird. Wenn ich einen Haltepunkt in einer Java-Datei im Bibliotheksprojekt festlege, wird der Haltepunkt beim Debuggen des endgültigen Projekts ausgelöst. Wenn der Debugger die Ausführung unterbricht, wird jedoch die .class-Datei angezeigt, die ihre eigenen Haltepunkte hat, und daher wird der in der .java-Datei festgelegte Haltepunkt hier nicht angezeigt!

Lösung: Um den Haltepunkt zu entfernen, müssen Sie den Haltepunkt in die Java-Datei im Bibliotheksprojekt entfernen.

HAL9000
quelle
2

Ich bin auf ein Problem gestoßen, bei dem eine Quelldatei dauerhafte Markierungen für nicht vorhandene Haltepunkte enthielt. Ich habe versucht, das Projekt zu bereinigen, einen vollständigen Build durchzuführen und Eclipse neu zu starten - nichts hat funktioniert.

Ich habe die Eclipse-Metadaten durchsucht und die .markers-Datei des Projekts gefunden. Durch das Löschen dieser Datei wurde das Problem behoben.

Wenn Sie dieses Problem haben, öffnen Sie Ihr Arbeitsbereichsverzeichnis, navigieren Sie zu .metadata / .plugins / org.eclipse.core.resources / .projects / your project und benennen Sie die Dateimarker um / entfernen Sie sie.

Wenn Ihr Arbeitsbereichsordner beispielsweise ~ / workspace lautet und Ihr Projekt Foo heißt, können Sie Folgendes tun:

$ mv ~/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers
Javagrendel
quelle
0

Für diejenigen, die aus den vorherigen Antworten keine Lösung gefunden haben, können sie versuchen, was mein Problem gelöst hat. Es ist meiner Meinung nach ähnlich wie bei HAL9000 Problem / Lösung

Wenn Sie zwei Klassen mit demselben Namen haben (in zwei verschiedenen Projekten), gelten die Haltepunkte für die eine auch für die andere. Beide werden im Fenster "Haltepunkte" angezeigt.

Lösung : Wenn Sie den Haltepunkt aus der Klasse mit demselben Namen entfernen, den Sie nicht verwenden, wird der Haltepunkt aus der Klasse entfernt, die Sie debuggen.

Christopher
quelle