Depuración remota de una aplicación Java

254

Tengo una aplicación Java ejecutándose en una máquina Linux. Ejecuto la aplicación Java usando lo 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. Uso eclipse de la máquina con Windows XP e intento conectarme a esta aplicación. También he abierto el puerto en Windows.

Ambas máquinas están en la LAN, pero parece que no puedo conectar el depurador a la aplicación Java. ¿Qué estoy haciendo mal?

dzidzitop
fuente
No es un duplicado en absoluto. Primero, esta es una pregunta anterior. En segundo lugar, la respuesta a esta pregunta debe ser independiente del entorno de depuración.
Addison el

Respuestas:

476

Editar: Noté que algunas personas están cortando y pegando la invocación aquí. La respuesta que di originalmente fue relevante solo para el OP. Aquí hay un estilo de invocación más moderno (incluido el uso del puerto más convencional de 8000):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

La respuesta original sigue.


Prueba esto:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

Dos puntos aquí:

  1. No hay espacios en la runjdwpopción.
  2. Las opciones vienen antes del nombre de la clase. ¡Cualquier argumento que tenga después del nombre de la clase son argumentos para su programa!
Chris Jester-Young
fuente
2
@DJGummikuh ¡Bien! He actualizado la publicación para usar la -agentlibopción de estilo más nuevo para su placer de cortar y pegar. :-)
Chris Jester-Young
¿Siempre necesitamos tener el código fuente para que la aplicación remota esté presente en la máquina donde realizamos la depuración remota?
MasterJoe2
Necesitas saber el código fuente. O tiene los archivos .java o tiene los archivos .jar / .class combinados con el descompilador. IDE como Eclipse puede tener un descompilador como JDecompiler instalado para que pueda depurar el archivo .class como si fuera un archivo .java (excluyendo los comentarios).
Iwan Satria
1
Vale la pena repetir un comentario de este stackoverflow.com/a/138518/500902 , "Como Java 9" address = 1044 "no siempre escucha en todas las interfaces". Address = *: 1044 "hace que Java 9+ se comporte como Java 8" permitir la depuración desde un host diferente
Marvin
84

Para 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 el nuevo JDK:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006

Cambie el número de puerto según sus necesidades.

De java technotes

A partir de 5.0, la opción -agentlib: jdwp se usa para cargar y especificar opciones para el agente JDWP. Para versiones anteriores a 5.0, se utilizan las opciones -Xdebug y -Xrunjdwp (la implementación 5.0 también admite las opciones -Xdebug y -Xrunjdwp pero la opción más nueva -agentlib: jdwp es preferible ya que el agente JDWP en 5.0 usa la interfaz JVM TI para la VM en lugar de la interfaz JVMDI más antigua)

Una cosa más a tener en cuenta, de la documentación de la interfaz de la herramienta JVM :

JVM TI se introdujo en JDK 5.0. JVM TI reemplaza la Interfaz Java Virtual Machine Profiler (JVMPI) y la Java Virtual Machine Debug Interface (JVMDI) que, a partir de JDK 6, ya no se proporcionan.

Sairam Krish
fuente
Lo siguiente funciona con la configuración predeterminada de Eclipse: -agentlib: jdwp = transport = dt_socket, server = y, address = 8000
Sundae
29

Pasos:

  1. Inicie su aplicación Java remota con opciones de depuración como se dijo en la publicación anterior.
  2. Configure Eclipse para la depuración remota especificando el host y el puerto.
  3. Inicie la depuración remota en Eclipse y espere a que la conexión se realice correctamente.
  4. Configurar punto de interrupción y depuración.
  5. Si desea depurar desde el inicio de la aplicación, use suspend = y, esto mantendrá la aplicación remota suspendida hasta que se conecte desde eclipse.

Consulte la guía paso a paso sobre depuración remota de Java para obtener todos los detalles.

Gaurav
fuente
16

Respuesta que cubre Java> = 9:

Para Java 9+, la opción JVM necesita un ligero cambio al prefijar la dirección con la dirección IP de la máquina que aloja la JVM, o simplemente *:

-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n

Esto se debe a un cambio observado 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 conectarse.

M Anouti
fuente
8

Me gustaría enfatizar que el orden de los argumentos es importante .

Para mí, el java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarcomando abre el puerto del depurador ,

pero el java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000comando no .

El Sr. Black
fuente
3
Supongo que es porque en su segundo ejemplo, todo después de "app.jar" se pasa como argumentos a su método principal
xoX Zeus Xox
@xoXZeusXox, ja, ja. Sí, pasó como argumentos. Gracias por mencionar
MrBlack
1

Así es como debe configurar Eclipse Debugger para la depuración remota:

Configuración de Eclipse:

1. Haga clic en el botón Ejecutar
2. Seleccione las configuraciones de depuración
3. Seleccione la "Aplicación Java remota"
4. Nueva configuración

  • Nombre: GatewayPortalProject
  • Proyecto: GatewayPortal-portlet
  • Tipo de conexión: conexión de enchufe
  • Propiedades de conexión: i) localhost ii) 8787

Para JBoss:

1.Cambie el /path/toJboss/jboss-eap-6.1/bin/standalone.confen su vm de la siguiente manera: Elimine el comentario de la siguiente línea eliminando el #:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Para Tomcat:

En el archivo catalina.bat :

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: Ejecute Tomcat desde el símbolo del sistema como a continuación:

catalina.sh jpda start

Luego, debe establecer puntos de interrupción en las clases Java que desea depurar.

Pritam Banerjee
fuente
En Java 8, el JDK admite una variable de entorno JAVA_TOOL_OPTIONS para habilitar el depurador para cualquier aplicación Java que necesite usar: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps perdón por las ediciones, luchando con el formateador.
Nathan Niesen