2009-04-06 7 views
68

Tengo un proyecto pequeño que, cuando se ejecuta en el depurador de Eclipse, siempre parece detenerse en FileInputStream.class línea 106, donde se abren los archivos. No hay puntos de interrupción establecidos, pero Eclipse se comporta exactamente como si tuviera un punto de interrupción aquí. Si borro todos los puntos de interrupción, aún sucede.¿Por qué mi proyecto Eclipse tiene puntos de interrupción phantom depurador?

Tengo un segundo proyecto mucho más grande en el mismo espacio de trabajo de Eclipse que no sufre este problema.

Acabo de mover el proyecto más pequeño de mi antigua máquina Linux, donde lo desarrollé en Europa Eclipse y tuve este problema, en mi nueva máquina Windows, donde continúo viendo el problema en Ganymede Eclipse. El problema persiste en todos los sistemas operativos y en las versiones de Eclipse, aunque aparentemente no en todos los proyectos. ¡No lo entiendo! Repasé todos los archivos en el directorio de este proyecto y no pude encontrar nada que pudiera ser un archivo que ordenara a Eclipse detenerse en FileInputStream.

Más información: el punto de interrupción aparente no es en realidad para la línea 106 de FileInputStream; parece ser un punto de interrupción de excepción para FileNotFoundException, que se lanza desde el código nativo llamado desde esa línea en FileInputStream. Pero, de nuevo, no parece tener ningún punto de interrupción establecido en absoluto. ¿Los puntos de interrupción de excepción están definidos en otro lugar?

+0

Me preguntaba acerca de eso a mí mismo, a menudo me encuentro con parada en los puntos de interrupción que yo podría haber jurado que lo eliminé – Uri

+0

Acabo de agregar una explicación sobre esta función de "suspender en cualquier excepción no detectada", como se solicitó – VonC

Respuesta

110

¿trató de de-selecciona

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

? (Como mentioned in this thread, por ejemplo)

alt text

¿Por qué funciona Eclipse de esa manera?

Es goes back to 2002, cuando la jerarquía de objetos del punto de interrupción se ha eliminado.

Con el fin de establecer un punto de interrupción, con la vieja API, un cliente de Java requiere modelar objetos - como IType, IField, etc.
Con la nueva API, todo lo que se requiere por el modelo de depuración es de tipo nombres, nombres de campos, etc.

Esto permite a los clientes establecer puntos de interrupción cuando los objetos del modelo de Java no están disponibles.
Los clientes ahora especifican el recurso para asociar un punto de interrupción con (antes de que lo limitáramos a los recursos asociados del Modelo de Java).

Los puntos de interrupción ahora también pueden estar "ocultos". Es decir, no necesitan estar registrados con el administrador del punto de interrupción.
Los puntos de interrupción también pueden persistir selectivamente (los marcadores solo permiten la persistencia de todos/ninguno de un tipo de marcador).
Esto hace que el modelo de depuración sea más flexible y ofrece a los clientes más elementos básicos.

Esto también ha simplificado alguna parte de nuestra implementación de depuración de Java - por ejemplo, la función "suspend on any uncaught exception", se limita a establecer un punto de interrupción para el tipo llamado "java.lang.Throwable", en lugar de una específica IType en un proyecto específico.
El punto de interrupción no está registrado con el administrador de punto de interrupción (es deciroculto) - solo es conocido y utilizado por un cliente.
Otro ejemplo es "run to line breakpoint". Se eliminó IJavaRunToLineBreakpoint, ya que su funcionalidad especial ya no es necesaria. Ahora, la depuración de Java ui simplemente crea un "punto de corte de línea" que está oculto, no persistente, y tiene un recuento de aciertos de 1. Este es un ejemplo de proporcionar bloques de construcción a los clientes.

+0

¡Eso lo hizo! ¡Gracias! Ahora, ¿por qué Eclipse incluso funciona de esta manera? – skiphoppy

+0

Ayuda a detectar aquellas excepciones de tiempo de ejecución no comprobadas que su código no ha capturado. – VonC

+0

Me encuentro con el mismo comportamiento y no desmarqué "suspender la ejecución en excepciones de uhncaught". Prefiero dejar la opción marcada pero me interesaría saber qué excepción ocurrió, ¿cómo puedo saber esto? – HAL9000

34

Tuve un problema similar pero la solución aceptada no funcionó para mí. Estoy haciendo el desarrollo de Eclipse Android y he establecido algunos puntos de interrupción y luego los desarmé. Aunque los desactivé, Eclipse siguió deteniendo la ejecución en estos puntos de interrupción fantasmas. La solución para mí era abrir la ventana Puntos de interrupción:

Ventana> Mostrar vista> Otros ...

Depurar> Puntos de corte

A continuación, haga clic derecho en cualquier punto de interrupción y seleccione "Eliminar todo"

Desafortunadamente tiene que restablecer todos sus puntos de interrupción válidos, pero esto funcionó para mí y ha evitado mucha angustia y frustración en el futuro.

Algunas imágenes para guiar a otros:

Add Breakpoints window to Eclipse

Remove All (Breakpoints, right click)

+0

Gracias, Mark. Esto ayudó. Pero no los eliminé a todos, solo encontré el que causó problemas. – morphium

+0

Gracias Mark! Funcionó para mí, pero al igual que el tipo anterior, simplemente eliminé el que necesitaba. Frustrante que un punto de interrupción registrado ni siquiera se muestra en la vista del editor en la barra lateral. Verdaderamente son puntos "fantasmas" en ese caso. – The111

+0

Posiblemente encontré la solución al problema relacionado con su solución. La próxima vez que suceda pruebe mi solución a continuación. – HAL9000

4

Para aquellos que no encuentran otras soluciones útiles, he encontrado mi solución personal a mi problema. Trabajo con una biblioteca .jar que se genera al crear otro proyecto en el espacio de trabajo. Si configuro un punto de corte en .java en el proyecto de la biblioteca, entonces el punto de interrupción se activará al depurar el proyecto final. Sin embargo, cuando el depurador hace una pausa en la ejecución , se muestra el archivo .class que tiene sus propios puntos de interrupción y, por lo tanto, el punto de interrupción establecido en el archivo .java no se muestra aquí.

Solución: Con el fin de eliminar el punto de interrupción que tiene que quitar el punto de interrupción en el archivo .java, en el proyecto de la biblioteca.

0

Para aquellos que no encontraron una solución a partir de las respuestas anteriores, pueden probar lo que resolvió mi problema. Creo que es similar al problema/solución HAL9000

Si tiene dos clases con el mismo nombre (en dos proyectos diferentes), los puntos de interrupción en uno también se aplican en el otro. Ambos se muestran en la ventana "Puntos de interrupción".

Solución: Si elimina el punto de interrupción de la clase - con el mismo nombre - que no está utilizando, elimina el punto de interrupción de la clase que está depurando.

1

Me encontré con un problema en el que un archivo fuente tenía marcadores persistentes para los puntos de interrupción que no existían. Intenté limpiar el proyecto, hacer una compilación completa, reiniciar Eclipse, nada funcionó.

Empecé a buscar entre los metadatos de Eclipse y encontré el archivo .markers de los proyectos. Eliminar ese archivo finalmente solucionó el problema.

Para cualquier otra persona que tenga este problema, abra su directorio de área de trabajo, navegue a .metadata/.plugins/org.eclipse.core.resources/.projects/su proyecto, luego cambie el nombre/elimine el archivo .markers.

Por ejemplo, si la carpeta de espacio de trabajo es ~/espacio de trabajo, y su proyecto se llama Foo, que podría hacer:

$ mv ~/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers 
Cuestiones relacionadas