La depuración remota una aplicación Java
-
13-09-2019 - |
Pregunta
Tengo una aplicación Java que se ejecuta en la máquina Linux. Corro el uso de Java utilizando la siguiente:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
He abierto el puerto 4000 para TCP en esta máquina Linux. Yo uso eclipse desde la máquina de Windows XP y tratar de conectarse a esta aplicación. He abierto el puerto en Windows también.
Las dos máquinas están en la LAN pero me parece que no puede conectar el depurador a la aplicación Java. ¿Qué estoy haciendo mal?
Solución
Editar Me di cuenta de que algunas personas están cortando y pegando la invocación aquí. La respuesta que he dado originalmente era relevante sólo para el OP. He aquí un estilo de invocación más moderna (incluyendo el uso del puerto más convencional de 8000):
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>
Respuesta original sigue.
Prueba esto:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp
Dos puntos aquí:
- No hay espacios en la opción
runjdwp
. - Las opciones se entregan antes de que el nombre de la clase. Cualquier argumento que tiene después de que el nombre de la clase son argumentos a su programa!
Otros consejos
En el JDK 1.3 o anterior:
-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006
Para JDK 1.4
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006
Para más reciente de JDK:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006
Por favor, cambiar el número de puerto en función de sus necesidades.
A partir de notas técnicas java
A partir de la 5.0 en adelante -agentlib: jdwp opción se utiliza para cargar y especificar Opciones para el agente JDWP. Para versiones anteriores a 5.0, la -Xdebug y se utilizan las opciones -Xrunjdwp (la implementación 5.0 también es compatible con las opciones -Xdebug y -Xrunjdwp pero la más reciente -agentlib: opción JDWP es preferible como agente JDWP en 5,0 utiliza la interfaz JVM TI a la VM en lugar de la anterior interfaz JVMDI)
Una cosa más que observar, desde JVM Tool documentación de la interfaz :
JVM TI se introdujo en JDK 5.0. JVM TI reemplaza el Java Virtual Machine Profiler Interface (JVMPI) y la máquina virtual Java interfaz de depuración (JVMDI) que, como de JDK 6, ya no se proporciona.
pasos:
- Iniciar la aplicación Java remota con opciones de depuración como se ha dicho en el post anterior.
- Configurar Eclipse para la depuración remota especificando host y el puerto.
- Inicio de la depuración remota en Eclipse y esperar a que la conexión con éxito.
- Configuración de punto de interrupción y de depuración.
- Si desea depurar desde el inicio del uso de aplicaciones suspender = y, esto mantendrá aplicación remota suspendido hasta que se conecte de eclipse.
guía paso a paso en el control remoto de Java depuración para más detalles.
respuesta cubriendo Java> = 9:
Para Java 9+, la opción de JVM necesita un ligero cambio anteponiendo la dirección con la dirección IP de la máquina que alberga la JVM, o simplemente *
:
-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n
Esto es debido a un cambio observó en https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .
Para Java <9, el número de puerto es suficiente para conectar.
Así es como se debe configurar Eclipse depurador para la depuración remota:
Configuración de Eclipse:
1.Click el botón Ejecutar
2.Select las Configuraciones de depuración
3.Seleccione el “Java remoto de aplicaciones”
Configuración 4.New
- Nombre: GatewayPortalProject
- Proyecto: GatewayPortal-portlet
- Tipo de conexión: Conector hembra Adjuntar
- Propiedades de la conexión: i) localhost ii) 8787
Para JBoss:
1.Change la /path/toJboss/jboss-eap-6.1/bin/standalone.conf
en la máquina virtual de la siguiente manera:
Elimine la siguiente línea quitando el #:
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
Para Tomcat:
catalina.bat archivo:
Paso 1:
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
Paso 2:
JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
Paso 3: Ejecutar Tomcat desde símbolo del sistema, como a continuación:
catalina.sh jpda start
Luego hay que establecer puntos de interrupción en las clases de Java que el deseo de depuración.
Me gustaría hacer hincapié en que orden de los argumentos es importante .
Para mi comando java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jar
abre el puerto depurador
pero java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
comando no .
La mejor opción de depuración es la creación de registros y análisis de registros. Pero en algunos casos hay que depurar aplicaciones web desplegadas en el servidor.
Consulte remotamente depurar un enlace de la aplicación java web . flujo completo de depuración remota se describe aquí. Esperamos que le ayude.