2010-08-28 17 views
47

Mi piacciono molto le funzionalità di debug remoto della JVM. Ma mi chiedo come funzioni internamente.Debug remoto Java, come funziona tecnicamente?

La mia ipotesi: viene eseguita tramite una funzione JVM in cui il processo in esecuzione sta scaricando/utilizzando il codice sorgente dal remote-debugger collegato (come IDE) Conosce la linea dello stack-trace corrente e quindi può saltare al rispettivo punto di interruzione dell'IDE. La comunicazione di stack-trace e introspection dello stato dell'applicazione viene quindi eseguita tramite socket o shared-memory (impostazione del debugger remoto).

Qualcuno ha link/risorse interessanti su questo?

risposta

35

Le funzioni di debug della JVM sono fornite tramite Java Platform Debugger Architecture (JPDA).

Il JPDA stesso è composto dai seguenti:

  • Java Virtual Machine Tool Interface (JVM TI) - l'interfaccia di programmazione nativo per strumenti da utilizzare. Questa interfaccia consente l'ispezione statale e aiuta a controllare il flusso di esecuzione all'interno del debuggee.
  • Java Debug Wire Protocol (JDWP) - utilizzato per definire la comunicazione tra i processi del debugger e del debuggee.
  • Java Debug Interface (JDI): questa interfaccia consente agli sviluppatori di strumenti di scrivere applicazioni di debugger remote.

Lo schema elencato nello JPDA architecture structure è un buon punto di partenza. Altri posti da cercare sarebbero i guides listed in the JPDA page.

+0

Grazie, è stata una lettura utile. Solo per interesse proverò ad usare la libreria jdi.jar per vedere direttamente il debug in azione. –

+2

@manuel, se hai tempo e pazienza, dai un'occhiata al codice sorgente di JSwat (http://code.google.com/p/jswat/). È costruito sulla piattaforma Netbeans e funge da applicazione front-end per quanto riguarda JPDA. Devo ammettere che non ho esaminato le fonti. –

9

L'architettura di debug di Java si chiama JPDA. Probabilmente vorrai leggere il JPDA documentation. In particolare, lo Walk-through section fornisce un esempio di un IDE che si interfaccia con il JDI per ottenere un valore sullo stack.

7

Il debug di Eclipse inizia con ciò che viene definito come agenti.

La JVM, che esegue le origini ".class" soddisfatte, ha una funzione che consente di iniettare in JVM librerie esterne (scritte in Java o C++) durante il runtime. Queste librerie esterne sono indicate come agenti e hanno la possibilità di modificare il contenuto dei file .class eseguiti. Questi agenti hanno accesso alle funzionalità della JVM che non sono accessibili da un normale codice Java in esecuzione all'interno della JVM e possono essere utilizzate per fare cose interessanti come iniettare e modificare il codice sorgente in esecuzione, la profilazione ecc. Alcuni strumenti come JRebel (usato per la sostituzione a caldo del codice) utilizza questa funzionalità per ottenere la loro magia.

E per passare un Lib agente ad una JVM, lo fa tramite start up argomenti, utilizzando la -

agentlib:libname[=options] 

Stavamo passando un agente di nome Lib JDWP alla JVM in esecuzione di Tomcat. Jdwp è un'implementazione specifica JVM opzionale del JDWP (Java Debug Wire Protocol) che viene utilizzata per definire la comunicazione tra un debugger e una JVM in esecuzione. È l'implementazione, se presente viene fornita come libreria nativa della JVM come jdwp.so o jdwp.dll

Quindi cosa fa? In termini semplici, l'agente jdwp che passiamo serve fondamentalmente la funzione di essere un collegamento tra l'istanza JVM che esegue un'applicazione e un Debugger (che può trovarsi sia remoto che locale).Poiché è una libreria di agenti, ha la capacità di intercettare il codice in esecuzione, creare un ponte tra la JVM e un debugger e avere la funzionalità di un debugger applicata sulla JVM. Poiché nell'architettura JVM, la funzionalità di debug non si trova all'interno della JVM stessa ma viene estratta in strumenti esterni (che vengono definiti correttamente come debugger), questi strumenti possono risiedere sulla macchina locale che esegue la JVM in fase di debug o di esecuzione. da una macchina esterna. È questa architettura modulare disaccoppiata che ci consente di avere una JVM in esecuzione su una macchina remota e l'utilizzo del JDWP, di avere un debugger remoto in grado di comunicare con essa.

Ecco come funziona Eclipse debugger in breve.

+1

In realtà comprendo i fondamenti dell'agente JVM. Ma non è chiaro quando lo sviluppatore mette un punto di interruzione su una riga in eclissi, come funziona? Anche il codice deve essere compilato nella casella locale per eseguire il debug dell'applicazione remota remota? –