online - java remote debug
Establecer puntos de interrupción en Java (2)
Hay diferentes tipos de puntos de interrupción. Algunos puntos de interrupción están basados en líneas, otros no. La forma en que esto afecta su depuración real depende de lo que realmente haga su IDE. 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íneas. Si agrega un punto de interrupción en una línea que contiene la firma de un método, será un punto de interrupción de la entrada del 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 corte de línea no se asignará a la línea derecha, por supuesto. Por lo tanto, Java podría no detenerse en la línea que pretendía, y su IDE de hecho podría estar mostrando el método incorrecto o incluso la clase incorrecta. Pero un punto de interrupción en la entrada del método aún funcionará (se detendrá en el momento adecuado), incluso si la línea en la que se definió el método ha cambiado; pero nuevamente, un IDE puede mostrar la línea incorrecta en el depurador. (Y también hay otro tipo de eventos / puntos de interrupción, como la carga de clases, ... Puede consultar las subinterfaces de EventRequest si desea saber más sobre los EventRequest internos).
Para responder a su otra pregunta: los puntos de interrupción se aplican a todos los cargadores de clases en la JVM.
¿Cómo funciona la configuración de puntos de interrupción en Java? ¿Se basa únicamente en el nombre del archivo de origen y el número de línea? ¿El nombre de la clase o método también figura en?
Si tengo una versión anterior de la fuente en mi depurador y establezco un punto de interrupción, el cursor se apaga cuando paso a través. ¿Qué tan lejos puede estar? ¿Puede ir al método incorrecto (o incluso a la clase equivocada si hay más de una clase en ese archivo)?
¿Qué sucede cuando hay varias clases del mismo nombre en la JVM (podría suceder si tiene más de un cargador de clases)? ¿Todos consiguen el punto de quiebre?
En un contenedor de aplicaciones web, ¿puedo establecer puntos de interrupción para una sola aplicación web (y no para las demás)?
¿Cuánto de esto es IDE específico y cuánto está determinado 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 solo el filtrado realizado por Eclipse en un punto de interrupción incondicional en la JVM?
La JVM admite una API estándar para la depuración (consulte Arquitectura de depuración de la plataforma Java ), y todos los IDE utilizan el JPDA para hacer todo el trabajo pesado de establecer puntos de interrupción, calcular expresiones, etc. Los IDE "solo" lo envuelven en interfaces de usuario agradables.
Cuando establece un punto de interrupción, el IDE habla con la Interfaz de herramientas de la JVM (parte de JDPA) y le da el archivo de origen y el número de línea del punto de interrupción. La JVM tiene la información que necesita para asignar la ubicación física del punto de interrupción en 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 ese hilo y le dice al IDE el archivo fuente y el número de línea del punto de interrupción. El IDE le muestra la ubicación.
Cuando depuro a veces agrego o elimino líneas para solucionar un problema y luego continúo con el siguiente problema. Pero las cosas se complican porque los puntos de interrupción ahora parecen ser más temprano o más tarde de lo que esperaba, y si configuro nuevos puntos de interrupción, en realidad no están en la línea de origen en la que los establecí. Cuando esto sucede, reinicio el programa y luego el IDE y la JVM vuelven a ser coherentes.