2009-06-10 25 views
188

Ho un'applicazione java in esecuzione su macchina Linux. Eseguo l'applicazione Java utilizzando il seguente:Debug remoto di un'applicazione Java

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

ho aperto la porta 4000 per TCP sulla macchina Linux. Uso eclipse dal computer Windows XP e provo a connettermi a questa applicazione. Ho anche aperto 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?

+0

quale errore si ottiene? – Glen

+0

https://stackoverflow.com/a/46171836/1619407 –

risposta

387

Modifica: Ho notato che alcune persone stanno tagliando e incollando l'invocazione qui. La risposta che ho dato inizialmente era pertinente solo per l'OP. Ecco uno stile più moderno invocazione (compreso utilizzando la porta più convenzionale del 8000):

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

risposta originale segue.


Prova questo:

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

due punti qui:

  1. Niente spazi nell'opzione runjdwp.
  2. Le opzioni vengono prima del nome della classe. Tutti gli argomenti che hai dopo il nome della classe sono argomenti per il tuo programma!
+5

[Documentazione ufficiale di connessione e chiamata JDPA] (http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html# Invocazione) –

+2

@DJGummikuh Bello! Ho aggiornato il post per utilizzare l'opzione '-agentlib' più recente per il tuo piacere di incartare e incollare. :-) –

+0

Abbiamo sempre bisogno di avere il codice sorgente per l'app remota per essere presente nella macchina in cui eseguiamo il debug remoto? – testerjoe2

26

Passi:

  1. avviare l'applicazione Java remoto con opzioni di debug, come detto nel post sopra.
  2. Configurare Eclipse per il debug remoto specificando host e porta.
  3. Avviare il debug remoto in Eclipse e attendere il completamento della connessione.
  4. Setup breakpoint e debug.
  5. Se si desidera eseguire il debug dall'inizio dell'applicazione, utilizzare suspend = y, questa operazione manterrà sospesa l'applicazione remota finché non ci si connetterà da eclissi.

Vedere Step by Step guide on Java remote debugging per tutti i dettagli.

65

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 più recente JDK:

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

favore cambia il numero della porta in base alle proprie esigenze.

Da java technotes

Dal 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 è preferibile l'opzione new -agentlib: jdwp in quanto l'agente JDWP in 5.0 utilizza l'interfaccia TI JVM al VM, piuttosto che l'interfaccia JVMDI più vecchio)

una cosa da notare, da JVM Tool interface documentation:

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

+0

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

0

Questo è come è necessario impostare Eclipse debugger per il debug remoto:

Impostazioni Eclipse:

1.Click the Run pulsante
2.Selezionare il Configurazioni di debug
3 .Seleziona "Applicazione Java remota"
4. Nuova configurazione

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

Per JBoss:

1.Cambia il /path/toJboss/jboss-eap-6.1/bin/standalone.conf nella tua vm come segue: Rimuovere il commento dalla seguente riga rimuovendo il #:

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

Per Tomcat:

In catalina.bat di file:

Fase 1:

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

Passaggio 2:

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

Fase 3: Eseguire Tomcat dal prompt dei comandi come di seguito:

catalina.sh jpda start 

allora avete bisogno di impostare i punti di interruzione nelle classi Java che desiderate eseguire il debug.

-3

La migliore opzione di debug è creare registri e analizzare i registri. Ma in alcuni casi è necessario eseguire il debug dell'applicazione Web distribuita sul server.

Vedere il collegamento Remotely debug a java web application. Il flusso completo di debug remoto è descritto qui. Spero che ti sarà d'aiuto.

+1

Seriamente? Per analizzare un flusso di richieste, abiliterò la registrazione per tutte le richieste, la distribuirò e passerò attraverso GB di log? –

+0

Ti ho fornito il modo alternativo di eseguire il debug dell'applicazione Spring MVC e sì la registrazione è il modo migliore per eseguire il debug dell'applicazione remota. Se hai un'opzione migliore, fammelo sapere in modo che possiamo usarlo in futuro ... –