Quali sono le opzioni della riga di comando Java da impostare per consentire il debug remoto di JVM?


321

So che ci sono alcuni JAVA_OPTSda impostare per il debug remoto di un programma Java.

Cosa sono e cosa significano?

Risposte:


303

Ho questo articolo segnalibro su come impostare questa funzione per Java 5 e sotto.

Fondamentalmente eseguirlo con :

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

Per Java 5 e versioni successive , eseguilo con:

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

19
Vale la pena ricordare che potresti voler configurare il tuo indirizzo come *:1044per abilitare il debug remoto da qualsiasi computer
Herr Derb

6
HerrDerb ha ragione .. Poiché Java 9 "address = 1044" non è sempre in ascolto su tutte le interfacce. "address = *: 1044" fa in modo che Java 9+ si comporti come Java 8 ...
alfonx,

459

Prima di Java 5.0, usare -Xdebuge -Xrunjdwpargomenti. Queste opzioni funzioneranno ancora nelle versioni successive, ma verranno eseguite in modalità interpretata anziché in JIT, che sarà più lenta.

Da Java 5.0, è meglio usare la -agentlib:jdwpsingola opzione:

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

Le opzioni -Xrunjdwpo gli agentlib:jdwpargomenti sono:

  • transport=dt_socket : indica il modo utilizzato per connettersi a JVM (socket è una buona scelta, può essere utilizzato per il debug di un computer distante)
  • address=8000 : Porta TCP / IP esposta, per connettersi dal debugger,
  • suspend=y : se 'y', dire alla JVM di attendere che il debugger sia collegato per iniziare l'esecuzione, altrimenti (se 'n'), avvia l'esecuzione immediatamente.

7
Hai ragione. Ho provato con -Xdebug e -Xrunjdwp ma non ha funzionato. quando ho provato con -Xrunjdwp o agentlib: jdwp Funziona. (su Java 7)
RoboAlex l'

Questo ha funzionato solo per me quando ho inserito delle virgolette, altrimenti ho riscontrato questo errore: ERRORE: JDWP Trasporto non server server dt_socket = y suspend = y address = 8000 deve avere un indirizzo di connessione specificato tramite l'opzione 'address ='
Ring

1
È Xrunjdwpdeprecato (o rimosso?) Perché dovremmo sceglierlo agentlib:jdwp?
ArtOfWarfare il

2
Penso che ti sbagli. Netbeans utilizza -Xdebug -Xrunjdwpdurante il debug dei progetti Maven e funzionano come se fossero JIT.
Aleksandr Dubinsky,

78

Poiché Java 9.0 JDWP supporta solo le connessioni locali per impostazione predefinita. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Per il debug remoto è necessario eseguire il programma con l' *:indirizzo in:

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

1
Questo dovrebbe ottenere più voti, dal momento che è un suggerimento importante che si applica a tutte le nuove versioni di Java.
Sebastian S,

1
Basta prendere nota: il collegamento Oracle dice che questo otterrà lo stesso vecchio comportamento, ma non è sicuro e non è raccomandato.
Chanseok Oh

9

Per java 1.5 o versioni successive:

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

Per java 1.4:

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

Per java 1.3:

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

Ecco l'output di un semplice programma:

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

5

Giava

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

address specifica la porta alla quale consentirà il debug

Esperto di

** Debug Spring Boot app con Maven:

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

2

Ecco la soluzione più semplice.

Ci sono molte configurazioni speciali dell'ambiente necessarie se stai usando Maven. Quindi, se avvii il tuo programma da Maven, esegui semplicemente il mvnDebugcomando anziché mvn, si occuperà di avviare la tua app con il debug remoto configurato. Ora puoi semplicemente collegare un debugger sulla porta 8000.

Si occuperà di tutti i problemi ambientali per te.


1

Riga di comando

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

Gradle

gradle bootrun --debug-jvm

Esperto di

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

Qui usiamo solo un Socket Attaching Connector, che è abilitato di default quando il trasporto dt_socket è configurato e la VM è in esecuzione nella modalità di debug del server.

Per maggiori dettagli puoi consultare: https://stackify.com/java-remote-debugging/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.