web-dev-qa-db-fra.com

Pourquoi mon projet Eclipse a-t-il des points d'arrêt de débogueur fantôme?

J'ai un petit projet qui, lorsqu'il est exécuté dans le débogueur Eclipse, semble toujours s'arrêter dans la ligne 106 de FileInputStream.class, où les fichiers sont ouverts. Aucun point d'arrêt n'a été défini, mais Eclipse se comporte exactement comme si j'avais un point d'arrêt ici. Si j'efface tous les points d'arrêt, cela se produit quand même.

J'ai un deuxième projet beaucoup plus grand dans le même espace de travail Eclipse qui ne souffre pas de ce problème.

Je viens de déplacer le plus petit projet de mon ancienne machine Linux, où je l'ai développé dans Europa Eclipse. Ce problème a déjà eu lieu sur ma nouvelle machine Windows, où je continue à voir le problème dans Ganymede Eclipse. Le problème persiste dans les systèmes d'exploitation et les versions d'Eclipse, mais apparemment pas dans les projets. Je ne comprends pas! J'ai fouillé dans tous les fichiers du répertoire de ce projet et je n'ai rien trouvé qui puisse être un fichier demandant à Eclipse de s'arrêter dans FileInputStream.

Informations complémentaires : le point d'arrêt apparent n'est en réalité pas pour la ligne 106 de FileInputStream; il semble s'agir d'un point d'arrêt d'exception pour FileNotFoundException, renvoyé à partir du code natif appelé à partir de cette ligne dans FileInputStream. Mais encore une fois, je ne semble pas avoir de points d'arrêt définis du tout. Les points d'arrêt Exception sont-ils définis ailleurs?

69
skiphoppy

Avez-vous essayé de désélectionner 

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

? (comme mentionné dans ce fil , par exemple)

alt text

Pourquoi Eclipse fonctionne-t-il de cette façon?

Il remonte à 2002 , lorsque la hiérarchie des objets de points d'arrêt a été réduite. 

Pour définir un point d'arrêt, avec l'ancienne API, un objet de modèle Java requis par le client, tel que IType, IField, etc.
Avec la nouvelle API, tout ce qui est requis par le modèle de débogage est un nom de type, un nom de champ, etc. 

Cela permet aux clients de définir des points d'arrêt lorsque des objets de modèle Java ne sont pas disponibles.
Les clients spécifient maintenant la ressource à laquelle associer un point d'arrêt (avant que nous le contraignions aux ressources Java Model associées).

Les points d'arrêt peuvent maintenant aussi être "cachés". En d'autres termes, ils ne doivent pas nécessairement être enregistrés auprès du gestionnaire de points d'arrêt.
Les points d'arrêt peuvent également être conservés de manière sélective (les marqueurs permettaient uniquement la persistance de tout/aucun type de marqueur).
Cela rend le modèle de débogage plus flexible et donne aux clients davantage de blocs de construction. 

Cela a également simplifié une partie de notre implémentation de débogage Java - par exemple, la fonctionnalité "suspend on any uncaught exception", définit simplement un point d'arrêt pour le type nommé "Java.lang.Throwable", plutôt qu'une IType spécifique dans un projet spécifique.
Le point d'arrêt n'est pas enregistré auprès du gestionnaire de points d'arrêt (c'est-à-dire caché) - il n'est connu et utilisé que par un client.
Un autre exemple est le "run to line breakpoint". La IJavaRunToLineBreakpoint a été supprimée, car ses fonctionnalités spéciales ne sont plus nécessaires. Désormais, l'interface de débogage Java crée simplement un "point d'arrêt de ligne" qui est masqué, non persistant et compte un nombre de hit de 1. Il s'agit d'un exemple de fourniture de blocs de construction aux clients.

111
VonC

J'avais un problème similaire mais la solution acceptée ne fonctionnait pas pour moi. Je suis en train de développer Eclipse pour Android et j'avais défini des points d'arrêt, puis les avoir désactivés. Même si je les ai désactivées, Eclipse n'arrêtait pas l'exécution à ces points d'arrêt fantômes. La solution pour moi était d'ouvrir la fenêtre Points d'arrêt:

Fenêtre> Afficher la vue> Autre ...

Débogage> Points d'arrêt

Puis faites un clic droit sur un point d'arrêt et sélectionnez "Supprimer tout".

Malheureusement, vous devez réinitialiser tous vos points d'arrêt valides, mais cela a fonctionné pour moi et a permis d'éviter beaucoup d'angoisse et de frustration. 

Quelques images pour guider les autres:

Add Breakpoints window to Eclipse

Remove All (Breakpoints, right click)

34
Mark Scheel

Pour ceux qui ne trouvent pas d'autres solutions utiles, j'ai trouvé ma solution personnelle à mon problème. Je travaille avec une bibliothèque .jar qui est générée en construisant un autre projet dans l'espace de travail. Si je définis un point d'arrêt dans un fichier .Java dans le projet de bibliothèque, il sera déclenché lors du débogage du projet final. Cependant, lorsque le débogueur met en pause l'exécution le fichier .class est affiché avec ses propres points d'arrêt et par conséquent le point d'arrêt défini dans le fichier .Java n'est pas affiché ici! 

Solution: Pour supprimer le point d'arrêt, vous devez le supprimer dans le fichier .Java, dans le projet de bibliothèque.

5
HAL9000

J'ai rencontré un problème où un fichier source avait des marqueurs persistants pour les points d'arrêt qui n'existaient pas. J'ai essayé de nettoyer le projet, de faire une compilation complète, de redémarrer Eclipse - rien ne fonctionnait.

Je suis allé fouiller dans les métadonnées Eclipse et j'ai trouvé le fichier .markers de projets. La suppression de ce fichier a finalement résolu le problème.

Si vous rencontrez ce problème, ouvrez votre répertoire d’espace de travail, accédez à .metadata/.plugins/org.Eclipse.core.resources/.projects/votre projet, puis renommez/supprimez le fichier .markers.

Par exemple, si votre dossier d’espace de travail est ~/workspace et que votre projet s’appelle Foo, vous pouvez procéder comme suit:

$ mv ~/workspace/.metadata/.plugins/org.Eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers
1
javagrendel

Pour ceux qui n'ont pas trouvé de solution à partir des réponses précédentes, ils peuvent essayer ce qui a résolu mon problème. Je pense que similaire à HAL9000 problème/solution

Si vous avez deux classes portant le même nom (dans deux projets différents) les points d'arrêt de l'un, appliquez-les également. Les deux apparaissent dans la fenêtre "Points d'arrêt".

Solution : Si vous supprimez le point d'arrêt de la classe - avec le même nom - que vous ne l'utilisez pas, il supprime le point d'arrêt de la classe en cours de débogage.

0
Christopher