Debug remoto di un'applicazione Java


254

Ho un'applicazione Java in esecuzione su una macchina Linux. Eseguo l'applicazione java utilizzando quanto segue:

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

Ho aperto la porta 4000 per TCP su questa macchina Linux. Uso eclipse dalla macchina Windows XP e provo a connettermi a questa applicazione. Ho aperto anche la porta in Windows.

Entrambe le macchine sono sulla LAN ma non riesco a connettere il debugger all'applicazione Java. Che cosa sto facendo di sbagliato?




Non è affatto un duplicato. Innanzitutto, questa è una domanda più vecchia. In secondo luogo, la risposta a questa domanda dovrebbe essere agnostica dell'ambiente di debug.
Addison

Risposte:


476

Modifica: ho notato che alcune persone stanno tagliando e incollando l'invocazione qui. La risposta che ho dato inizialmente era pertinente solo per il PO. Ecco uno stile di invocazione più moderno (incluso l'utilizzo della porta più convenzionale di 8000):

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

Segue la risposta originale.


Prova questo:

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

Due punti qui:

  1. Nessuno spazio runjdwpnell'opzione.
  2. Le opzioni vengono prima del nome della classe. Qualsiasi argomento che hai dopo il nome della classe sono argomenti per il tuo programma!


2
@DJGummikuh Nice! Ho aggiornato il post per utilizzare l' -agentlibopzione di stile più recente per il tuo piacere di tagliare e incollare. :-)
Chris Jester-Young,

Abbiamo sempre bisogno di avere il codice sorgente affinché l'app remota sia presente nella macchina in cui eseguiamo il debug remoto?
MasterJoe2,

Devi conoscere il codice sorgente. O hai i file .java o hai i file .jar / .class combinati con il decompilatore. IDE come Eclipse può avere un decompilatore come JDecompiler installato in modo da poter eseguire il debug del file .class come se fosse un file .java (esclusi i commenti).
Iwan Satria,

1
Vale la pena ripetere un commento da questo stackoverflow.com/a/138518/500902 , "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" per consentire il debug da host diversi
Marvin,

84

Per JDK 1.3 o precedenti:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

Per JDK 1.4

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

Per JDK più recente:

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

Modifica il numero di porta in base alle tue esigenze.

Da java technotes

Da 5.0 in poi l'opzione -agentlib: jdwp viene utilizzata per caricare e specificare le opzioni per l'agente JDWP. Per le versioni precedenti alla 5.0, vengono utilizzate le opzioni -Xdebug e -Xrunjdwp (l'implementazione 5.0 supporta anche le opzioni -Xdebug e -Xrunjdwp ma la nuova opzione -agentlib: jdwp è preferibile poiché l'agente JDWP in 5.0 utilizza l'interfaccia JVM TI per la macchina virtuale anziché l'interfaccia JVMDI precedente)

Un'altra cosa da notare, dalla documentazione dell'interfaccia di JVM Tool :

JVM TI è stato introdotto in JDK 5.0. JVM TI sostituisce JVMPI (Java Virtual Machine Profiler Interface) e JVMDI (Java Virtual Machine Debug Interface) che, a partire da JDK 6, non vengono più forniti.


Quanto segue funziona con le impostazioni predefinite di Eclipse: -agentlib: jdwp = transport = dt_socket, server = y, address = 8000
Sundae

29

passi:

  1. Avvia la tua applicazione java remota con le opzioni di debug come detto nel post precedente.
  2. Configurare Eclipse per il debug remoto specificando host e porta.
  3. Avvia il debug remoto in Eclipse e attendi che la connessione abbia esito positivo.
  4. Breakpoint di installazione e debug.
  5. Se si desidera eseguire il debug dall'inizio dell'applicazione, utilizzare suspend = y, in questo modo l'applicazione remota verrà sospesa fino alla connessione da eclipse.

Consulta la guida passo passo sul debug remoto Java per tutti i dettagli.



8

Vorrei sottolineare che l' ordine degli argomenti è importante .

Per me il java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarcomando apre la porta del debugger ,

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


3
Immagino che sia perché nel tuo secondo esempio, tutto ciò che segue "app.jar" è passato come argomento al tuo metodo principale
xoX Zeus Xox

@xoXZeusXox ah ah. Sì, è passato come argomento. Grazie per averlo menzionato.
Mr Black,

1

Ecco come installare Eclipse Debugger per il debug remoto:

Impostazioni Eclipse:

1.Fare clic sul pulsante Esegui
2. Selezionare le configurazioni di debug
3. Selezionare "Applicazione Java remota"
4. Nuova configurazione

  • Nome: GatewayPortalProject
  • Progetto: GatewayPortal-portlet
  • Tipo di connessione: Socket Attach
  • Proprietà connessione: i) localhost ii) 8787

Per JBoss:

1.Cambia /path/toJboss/jboss-eap-6.1/bin/standalone.confnel tuo vm come segue: Rimuovi il commento dalla seguente riga rimuovendo il #:

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

Per Tomcat:

Nel file catalina.bat :

Passo 1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

Passo 2:

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

Passaggio 3: eseguire Tomcat dal prompt dei comandi come di seguito:

catalina.sh jpda start

Quindi è necessario impostare i punti di interruzione nelle classi Java che si desidera eseguire il debug.


In Java 8 JDK supporta una variabile d'ambiente JAVA_TOOL_OPTIONS in modo da abilitare il debugger per qualsiasi applicazione Java che devi usare: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps scusami per le modifiche, combattendo con il formattatore.
Nathan Niesen,
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.