trucos - ¿Por qué mi proyecto Eclipse tiene puntos de interrupción phantom depurador?
trucos de eclipse (5)
¿Trataste de deseleccionar?
Window > Preferences > Java > Debug : Suspend execution on uncaught exceptions
? (como se menciona en este hilo , por ejemplo)
¿Por qué funciona Eclipse de esa manera?
Se remonta a 2002 , cuando la jerarquía de objetos del punto de interrupción se ha eliminado.
Para establecer un punto de interrupción, con la API anterior, un cliente necesitaba objetos del modelo de Java, como
IType
,IField
, etc.
Con la nueva API, todo lo que requiere el modelo de depuración es nombres de tipos, 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 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 que persista todo / 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 una parte de nuestra implementación de depuración de Java; por ejemplo, la característica "
suspend on any uncaught exception
", simplemente establece un punto de interrupción para el tipo denominado "java.lang.Throwable
", en lugar de un tipo deIType
específico en un proyecto específico .
El punto de interrupción no está registrado con el administrador del punto de interrupción (es decir, oculto ), solo es conocido y utilizado por un cliente .
Otro ejemplo es el "run to line breakpoint
". Se ha eliminado elIJavaRunToLineBreakpoint
, 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.
Tengo un pequeño proyecto 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.
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 corte aparente no es realmente 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?
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ó.
Busqué 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, luego navegue hasta .metadata / .plugins / org.eclipse.core.resources / .projects / su proyecto, luego cambie el nombre / elimine el archivo .markers.
Por ejemplo, si su carpeta de espacio de trabajo es ~ / workspace, y su proyecto se llama Foo, podría hacer:
$ mv ~/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers
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, se aplican también 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.
Para aquellos que no encuentran otras soluciones útiles, encontré 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 corte establecido en el archivo .java no se muestra aquí.
Solución: para eliminar el punto de interrupción, debe eliminar el punto de interrupción en el archivo .java, en el proyecto de la biblioteca.
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í fue abrir la ventana Puntos de ruptura:
Ventana> Mostrar vista> Otro ...
Depurar> Puntos de interrupción
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: