¿Cuáles son las opciones de línea de comandos de Java para configurar para permitir que JVM se depure de forma remota?

321

Sé que hay algunos JAVA_OPTSpara configurar para depurar remotamente un programa Java.

¿Qué son y qué significan?

paulgreg
fuente

Respuestas:

303

Tengo este artículo marcado como favorito para configurar esto para Java 5 y siguientes.

Básicamente ejecútalo con :

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

Para Java 5 y superior , ejecútelo con:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
Hans Sjunnesson
fuente
19
Vale la pena mencionar que es posible que desee configurar su dirección *:1044para habilitar la depuración remota desde cualquier computadora
Herr Derb
66
HerrDerb tiene razón. Dado que Java 9 "address = 1044" no siempre escucha en todas las interfaces. "address = *: 1044" hace que Java 9+ se comporte como Java 8 ...
alfonx
459

Antes de Java 5.0, uso -Xdebugy -Xrunjdwpargumentos. Estas opciones seguirán funcionando en versiones posteriores, pero se ejecutarán en modo interpretado en lugar de JIT, que será más lento.

Desde Java 5.0, es mejor usar la -agentlib:jdwpopción única:

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

Las opciones -Xrunjdwpo agentlib:jdwpargumentos son:

  • transport=dt_socket : significa la forma en que se conecta a JVM (el socket es una buena opción, se puede usar para depurar una computadora distante)
  • address=8000 : Puerto TCP / IP expuesto, para conectarse desde el depurador,
  • suspend=y : si es 'y', dígale a la JVM que espere hasta que se adjunte el depurador para comenzar la ejecución; de lo contrario (si 'n'), comienza la ejecución de inmediato.
paulgreg
fuente
77
Estás exactamente en lo correcto. Intenté con -Xdebug y -Xrunjdwp pero no funcionó. cuando probé con -Xrunjdwp o agentlib: jdwp Está funcionando. (en Java 7)
RoboAlex
Esto solo funcionó para mí cuando puse comillas, de lo contrario recibí este error: ERROR: JDWP Transporte no servidor dt_socket server = y suspend = y address = 8000 debe tener una dirección de conexión especificada a través de la opción 'address ='
Ring
1
¿Está en Xrunjdwpdesuso (o eliminado)? ¿Por qué lo elegiríamos agentlib:jdwp?
ArtOfWarfare
2
Creo que estas equivocado. Netbeans se utiliza -Xdebug -Xrunjdwpal depurar proyectos de Maven, y se ejecutan como si estuvieran JIT.
Aleksandr Dubinsky
78

Desde Java 9.0 JDWP solo admite conexiones locales de forma predeterminada. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Para la depuración remota, se debe ejecutar un programa con la *:dirección de entrada:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
Antony Shumskikh
fuente
1
Esto debería obtener más votos positivos, ya que es una pista importante que se aplica a todas las nuevas versiones de Java.
Sebastian S
1
Solo haciendo una nota: el enlace de Oracle dice que esto logrará el mismo comportamiento anterior, pero no es seguro y no se recomienda.
Chanseok Oh
9

Para java 1.5 o superior:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Para java 1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Para java 1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Aquí está la salida de un programa simple:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled
thebiggestlebowski
fuente
5

Java

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address especifica el puerto en el que permitirá depurar

Maven

** Depurar la aplicación Spring Boot con Maven:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
Jovi Qiao
fuente
2

Aquí está la solución más fácil.

Hay muchas configuraciones especiales de entorno necesarias si está utilizando Maven. Entonces, si inicia su programa desde maven, simplemente ejecute el mvnDebugcomando en lugar de hacerlo mvn, se encargará de iniciar su aplicación con la depuración remota configurada. Ahora puede adjuntar un depurador en el puerto 8000.

Se encargará de todos los problemas ambientales para usted.

neves
fuente
1

Línea de comando

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER

Gradle

gradle bootrun --debug-jvm

Maven

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
Santosh b
fuente
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Aquí solo usamos un conector de conexión de socket, que está habilitado de forma predeterminada cuando se configura el transporte dt_socket y la VM se ejecuta en el modo de depuración del servidor.

Para obtener más detalles, puede consultar: https://stackify.com/java-remote-debugging/

Huesudo
fuente