Debug remoto con Java ed Eclipse

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:

  • address: indica l'indirizzo IP e la porta TCP alla quale ci dovremo connettere
  • suspend: puo essere 'n' oppure 'y'. Se impostato ad 'y' l'applicazioni aspettarà che ci colleghiamo in debug prima di andare in esecuzione, altrimenti andrà in esecuzione immediatamente.

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: 

  • andate nel menu "Run" e poi su "Debug Configurations..."
  • nell'area di sinistra cliccate con il tasto destro su "Remote Java Application" e poi su "New"
  • mettete l'indirizzo IP della macchina sulla quale gira la vostra applicazione nel campo "Host" (oppure mettete "localhost" se siete sulla stessa postazione)
  • mettete il valore 1044 nel campo "Port"
  • clicchiamo sul pulsante "Debug"

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.