2009-05-13 22 views
15

¿Cómo funciona la configuración de puntos de interrupción en Java? ¿Se basa únicamente en el nombre del archivo fuente y el número de línea? ¿El nombre de clase o método también figura en?Establecimiento de puntos de interrupción en Java

Si tengo una versión antigua de la fuente en mi depurador y establecer un punto de interrupción, el cursor está apagado cuando me paso a través. ¿Qué tan lejos puede estar? ¿Puede entrar el método incorrecto (o incluso la clase incorrecta si hay más de una clase en ese archivo)?

¿Qué ocurre cuando hay varias clases del mismo nombre en la JVM (que podría suceder si usted tiene más de un cargador de clases)? ¿Todos ellos obtienen el punto de inflexión?

En un contenedor de aplicaciones web, puedo establecer puntos de corte para una sola aplicación web (y no los otros)?

¿Cuánto de esto es IDE específico y la cantidad se determina por la interfaz de depuración que proporciona la JVM? Por ejemplo: en Eclipse puedo establecer puntos de interrupción condicionales en función de los valores de las variables. ¿Es eso solo el filtrado realizado por Eclipse en un punto de interrupción incondicional en la JVM?

+0

Realmente creo que necesitas ser más específico de IDE aquí. –

+0

¿No todos los IDE utilizan la misma interfaz de depuración que proporciona la JVM? – Thilo

Respuesta

13

Existen diferentes tipos de puntos de interrupción. Algunos puntos de interrupción están basados ​​en líneas, otros no. Cómo esto afecta su depuración real depende de lo que su IDE realmente hace. Por ejemplo, en Eclipse, si agrega un punto de interrupción en medio de un método, será un punto de interrupción basado en línea. Si agrega un punto de interrupción en una línea que contiene la firma de un método, ese será un punto de acceso de entrada de método.

Si el código fuente que está viendo no es la fuente exacta de la clase que se está ejecutando, un punto de interrupción de línea no se asignarán a la línea derecha, por supuesto. Entonces java podría no detenerse en la línea que pretendías, y tu IDE podría mostrarte el método incorrecto o incluso la clase incorrecta. Pero un punto de interrupción de entrada de método seguirá funcionando (se detendrá en el momento correcto), incluso si la línea en la que se definió el método ha cambiado; pero una vez más, un IDE podría mostrar la línea incorrecta en el depurador. (Y también hay otros tipos de eventos/puntos de interrupción, como la carga de clases, ... Puede consultar las subinterfaces de EventRequest si desea obtener más información acerca de las partes internas).

Para responder a su otra pregunta: los puntos de interrupción se aplican a todos los cargadores de clases en la JVM.

6

La JVM admite una API estándar para la depuración (ver Java Platform Debugger Architecture), y todos los IDE utilizan el JPDA para hacer todo el trabajo pesado de establecer puntos de interrupción, expresiones de cálculo, etc. Los IDEs "solo" lo envuelven en agradables interfaces de usuario.

Cuando se establece un punto de interrupción, las conversaciones IDE a la interfaz de la herramienta de la JVM (parte de JDPA) y le da el archivo de origen y el número de línea del punto de ruptura. La JVM tiene la información que necesita para asignar la ubicación física del punto de interrupción a la ubicación real de la declaración de Java en el código compilado de la clase. Cuando la JVM alcanza un punto de interrupción, deja de ejecutar esa secuencia y le dice al IDE el archivo fuente y el número de línea del punto de interrupción. El IDE luego le muestra la ubicación.

Cuando depuro algunas veces agrego o elimino líneas para solucionar un problema, y ​​luego continúo con el siguiente problema. Pero las cosas se vuelven extrañas porque los puntos de corte ahora parecen ser más rápidos o más rápidos de lo que esperaba, y si establezco nuevos puntos de interrupción, en realidad no están en la línea de origen en la que los configuré. Cuando esto sucede, reinicio el programa y luego tanto el IDE como la JVM son consistentes nuevamente.

Cuestiones relacionadas