Quelles sont les options de ligne de commande Java à définir pour permettre à la machine virtuelle Java d'être déboguée à distance?

321

Je sais qu'il y en a JAVA_OPTSpour régler le débogage à distance d'un programme Java.

Que sont-ils et que signifient-ils?

paulgreg
la source

Réponses:

303

J'ai cet article mis en signet sur la configuration de cela pour Java 5 et ci-dessous.

Exécutez-le essentiellement avec :

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

Pour Java 5 et supérieur , exécutez-le avec:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
Hans Sjunnesson
la source
19
Il convient de mentionner que vous souhaiterez peut-être configurer votre adresse *:1044pour activer le débogage à distance à partir de n'importe quel ordinateur
Herr Derb
6
HerrDerb a raison. Puisque Java 9 "address = 1044" n'écoute pas toujours sur toutes les interfaces. "address = *: 1044" fait que Java 9+ se comporte comme Java 8 ...
alfonx
459

Avant Java 5.0, utilisez -Xdebuget -Xrunjdwparguments. Ces options fonctionneront toujours dans les versions ultérieures, mais elles s'exécuteront en mode interprété au lieu de JIT, qui sera plus lent.

Depuis Java 5.0, il est préférable d'utiliser la -agentlib:jdwpseule option:

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

Les options -Xrunjdwpou agentlib:jdwparguments sont:

  • transport=dt_socket : signifie le moyen utilisé pour se connecter à la JVM (le socket est un bon choix, il peut être utilisé pour déboguer un ordinateur distant)
  • address=8000 : Port TCP / IP exposé, pour se connecter depuis le débogueur,
  • suspend=y : si 'y', dites à la JVM d'attendre que le débogueur soit attaché pour commencer l'exécution, sinon (si 'n'), commence immédiatement l'exécution.
paulgreg
la source
7
Vous avez exactement raison .. J'ai essayé avec -Xdebug et -Xrunjdwp mais cela n'a pas fonctionné. quand j'ai essayé avec -Xrunjdwp ou agentlib: jdwp Cela fonctionne. (sur Java 7)
RoboAlex
Cela ne fonctionnait pour moi que lorsque je mettais des guillemets, sinon j'ai eu cette erreur: ERREUR: JDWP Transport non serveur dt_socket server = y suspend = y address = 8000 doit avoir une adresse de connexion spécifiée via l'option 'address ='
Ring
1
Est Xrunjdwpobsolète (ou supprimé?) Pourquoi le choisirions-nous agentlib:jdwp?
ArtOfWarfare
2
Je crois que vous avez tort. Netbeans utilise -Xdebug -Xrunjdwplors du débogage des projets Maven, et ils fonctionnent comme s'ils étaient JIT.
Aleksandr Dubinsky
78

Depuis Java 9.0, JDWP ne prend en charge que les connexions locales par défaut. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Pour le débogage à distance, il faut exécuter le programme avec l' *:adresse in:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
Antony Shumskikh
la source
1
Cela devrait obtenir plus de votes positifs, car il s'agit d'un indice important qui s'applique à toutes les nouvelles versions de Java.
Sebastian S
1
Juste une note: le lien Oracle dit que cela obtiendra le même comportement ancien, mais ce n'est pas sécurisé et n'est pas recommandé.
Chanseok Oh
9

Pour java 1.5 ou supérieur:

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

Pour java 1.4:

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

Pour java 1.3:

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

Voici la sortie d'un programme 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
la source
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 spécifie le port sur lequel il permettra le débogage

Maven

** Déboguer l'application Spring Boot avec Maven:

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

Voici la solution la plus simple.

De nombreuses configurations spéciales d'environnement sont nécessaires si vous utilisez Maven. Donc, si vous démarrez votre programme à partir de maven, exécutez simplement la mvnDebugcommande à la place de mvn, il se chargera de démarrer votre application avec le débogage à distance configuré. Maintenant, vous pouvez simplement attacher un débogueur sur le port 8000.

Il s'occupera de tous les problèmes environnementaux pour vous.

neves
la source
1

Ligne de commande

-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
la source
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Ici, nous utilisons simplement un connecteur de connexion de socket, qui est activé par défaut lorsque le transport dt_socket est configuré et que la machine virtuelle s'exécute en mode de débogage du serveur.

Pour plus de détails, vous pouvez vous référer à: https://stackify.com/java-remote-debugging/

Boney
la source