In questo articolo vedremo come poter effettuare il debug di applicazioni che sono in esecuzione su una macchina differente dalla propria postazione di lavoro. Tale possibilità può rivelarsi partcolarmente utile, ad esempio, per effettuare il debug di applicazioni che girano in ambiente di produzione e per le quali non si riesce a riprodurre in ambiente di test un bug che invece è evidente in ambiente di produzione. Per riuscire in quanto ci siamo prefissati ci affideremo alla tecnologia JPDA - Java Platform Debugger Architecture (maggiori informazioni qui)
Scriviamo una semplice applicazione, che non fa altro che scrivere qualcosa a video ogni secondo. Da Eclipse create un nuovo progetto Java con un unica classe:
--- inizio file RemoteDebug.java ---
public class RemoteDebug { public static void main(String[] args) throws Exception { long counter = 1; while(true) { Thread.sleep(1000); System.out.println("counter = "+counter); counter++; } } }
--- fine file RemoteDebug.java ---
Procediamo alla sua compilazione tramite il comando:
javac -g RemoteDebug.java
(l'opzione '-g' inserisce nel file class generato tutte le informazioni di debug)
A questo punto eseguiamo l'applicazione indicando alla virtual machine di abilitare il debugging remoto:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=indirizzoIP:1044 RemoteDebug
Dei parametri indicati i più utili sono:
A questo punto l'applicazione è in esecuzione e pronta per essere debuggata. Adesso procediamo a collegarci all'applicazione da un'altra postazione. Vediamo come farlo da Eclipse:
a questo punto eclipe si collega all'applicazione, si mette in prospettiva di debug e sarete in grado di effettuare tutte le classiche operazioni di debug (esecuzione passo-passo, watch di variabili, utilizzo dei breakpoint, etc..) ma in questo caso state debuggando un'applicazione in esecuzione su un'altra macchina!
Oltre ad Eclipse potete procedere al debug tramite il tool standard fornito con Java e cioè jdb.
Per utilizzarlo eseguite il comando:
jdb -attach indirizzoIp:1044
Sicuramente JDB è uno strumento molto più ostico di Eclipse... ma lo avrete a disposizione in ogni posto nel quale sia installata una JDK. Vediamo come ad esempio potremmo inserire un breakpoint alla riga 6 (la System.out per intenderci):
stop at RemoteDebug:6
visualizzare il contenuto della variabile "counter":
print counter
e poi andare al prossimo breakpoint:
next
Non voglio dilungarmi troppo su come si utilizzi jdb, probabilmente in futuro farò un articolo dedicato all'argomento.
Ricapitolando in questo articolo abbiamo visto come Java ci permetta con estrema semplicità di effettuare operazioni di debug anche su applicativi in esecuzioni su altre postazioni/server/etc.