Ci sono situazioni in cui è complesso riuscire a riprodurre locale una problematica evidenziata in ambiente di test o di produzione e, per una rapida risoluzione, vorremmo poter collegare il nostro ambiente di sviluppo ad un server remoto, introdurre breakpoints all'interno del codice ed eseguire dei test analizzando il flusso di esecuzione. Di seguito verrà mostrato un esempio pratico di debug remoto tramite l'IDE Eclipse e l'application server JBOSS Wildfly in ambiente Windows.
Consideriamo come esempio il debug di un'applicazione Web presente su un server remoto. Per poter collegare l'IDE di sviluppo è necessario che il server stesso venga mandato in esecuzione
specificando una serie di argomenti di input per la Java Virtual Machine. Nello specifico l'istruzione di startup dell'application server deve contenere i seguenti parametri: -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n
.
-Xdebug
abilita la JVM remota per la modalità debugging, mentre -Xrunjdwp
specifica dettagli di connessione tra cui:
- transport: può assumere i valori
dt_socket
per una socket interface oppureshmem
per l'utilizzo di una zona di memoria condivisa utile quando l'applicazione ed il debugger risiedono sulla stessa mecchina. - address: porta di ascolto dell'application server per il debug remoto.
- suspend: può assumere i valori
y
per indicare la sospensione dell'applicazione fino a che non ci sono debugger remoti connessi oppuren
per indicare la non sospensione dell'applicazione anche in assenza di debugger remoti connessi.
Nel nostro caso andiamo a realizzare una semplice Dynamic Web Application, contenente una servlet da richiamare, utilizzando il wizard di Eclipse. Esportiamo il pacchetto war
dell'applicativo, lo inseriamo nella directory deployments
del server e ci predisponiamo per il lancio di JBoss Wildfly con i parametri precedentemente illustrati.
Per poter modificare gli argomenti forniti in input alla JVM nella fase di startup di JBoss, editiamo il file standalone.conf.bat
contenuto nella directory bin
del server
modificando la linea set "JAVA_OPTS=-Xms64M -Xmx512M -XX:MaxPermSize=256M"
in set "JAVA_OPTS=-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -Xms64M -Xmx512M -XX:MaxPermSize=256M"
.
Posizioniamoci all'interno della directory bin
di JBOSS utilizzando una console Windows, ed eseguiamo il file standalone.bat
. Vedremo nella fase iniziale una stampa simile alla seguente:
dove possiamo notare la presenza dei parametri necessari all'avvio nella modalità debug remoto. Apriamo l'IDE Eclipse nella quale è presente alla nostra web application e inseriamo un breakpoint all'interno del codice della servlet di test. Successivamente utilizziamo l'icona di Debug, presente sulla toolbar dell'IDE, scegliendo all'apertura del menu l'opzione "Debug Configurations":
Nella successiva schermata selezioniamo "Remote Java Application" e clicchiamo sul pulsante della toolbar per la creazione di una nuova launch configuration come indicato nella seguente immagine:
Il risultato dell'operazione precedente è l'apertura del pannello per la configurazione dei dettagli di connessione della nostra applicazione. Nell'esempio il nome dell'applicazione di cui effettuare il debug remoto è RemoteTestWebApp
, nome che andremo ad inserire nel campo "Project". Dobbiamo invece aver cura di fornire il corretto indirizzo IP e il numero di porta del server remoto:
Non ci resta che fare click sul pulsante debug e aprire il browser per richiamare l'indirizzo Web della servlet presente nel progetto demo. Dovremmo avere come risposta l'entrata in debug dell'IDE fermo al primo breakpoint da noi inserito.