¿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?

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

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.

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

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

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"

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.


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

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/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.