2009-05-13 20 views
15

Come funzionano i breakpoint di impostazione in Java? Si basa solo sul nome del file sorgente e sul numero di riga? Anche il nome della classe o del metodo figura?Impostazione dei punti di interruzione in Java

Se ho una vecchia versione del codice sorgente nel mio debugger e impostato un punto di interruzione, il cursore si spegne quando passo. Quanto lontano può essere? Può andare nel metodo sbagliato (o anche nella classe sbagliata se ci sono più di una classe in quel file)?

Cosa succede quando ci sono più classi con lo stesso nome nella JVM (potrebbe succedere se si ha più di un classloader)? Ricevono tutti il ​​punto di interruzione?

In un contenitore di applicazioni Web, è possibile impostare i punti di interruzione per una sola applicazione Web (e non le altre)?

Quanto di questo è specifico IDE e quanto viene determinato dall'interfaccia di debug che fornisce JVM? Ad esempio: In Eclipse posso impostare i breakpoint condizionali in base ai valori delle variabili. È solo il filtraggio fatto da Eclipse su un punto di interruzione incondizionato nella JVM?

+0

Penso davvero che sia necessario essere più specifici IDE qui. –

+0

Non tutti gli IDE utilizzano la stessa interfaccia di debugger fornita da JVM? – Thilo

risposta

13

Esistono diversi tipi di punti di interruzione. Alcuni punti di interruzione sono basati sulla linea, altri no. Il modo in cui questo influisce sul tuo debug effettivo dipende da cosa fa effettivamente il tuo IDE. Ad esempio, in Eclipse, se si aggiunge un punto di interruzione nel mezzo di un metodo, questo sarà un punto di interruzione basato sulla linea. Se si aggiunge un punto di interruzione su una riga contenente la firma di un metodo, questo sarà un punto di interruzione di entrata del metodo.

Se il codice sorgente che stai guardando non è la fonte esatta della classe in esecuzione, un punto di interruzione di linea non verrà mappato sulla linea destra, naturalmente. Quindi java potrebbe non fermarsi alla linea che intendevi, e il tuo IDE potrebbe effettivamente mostrarti il ​​metodo sbagliato o anche una classe sbagliata. Ma un punto di interruzione di accesso al metodo continuerà a funzionare (fermarsi al momento giusto), anche se la linea su cui è stato definito il metodo è cambiata; ma di nuovo un IDE potrebbe mostrare la riga sbagliata nel debugger. (E ci sono anche altri tipi di eventi/punti di interruzione, come il caricamento delle classi, ... Potresti dare un'occhiata alle sottointerfacce di EventRequest se vuoi saperne di più sugli interni).

Per rispondere alla tua altra domanda: i punti di interruzione si applicano a tutti i classloader nella JVM.

6

JVM supporta un'API standard per il debug (vedere Java Platform Debugger Architecture) e tutti gli IDE utilizzano la JPDA per eseguire tutte le operazioni di impostazione dei punti di interruzione, calcolo delle espressioni e così via. Gli IDE "solo" lo avvolgono in interfacce utente carine.

Quando si imposta un punto di interruzione, l'IDE comunica con l'interfaccia strumento JVM (parte di JDPA) e fornisce il file di origine e il numero di riga del punto di interruzione. La JVM ha le informazioni necessarie per mappare la posizione fisica del punto di interruzione nella posizione effettiva dell'istruzione Java nel codice compilato della classe. Quando JVM raggiunge un punto di interruzione, interrompe l'esecuzione di quel thread e comunica all'IDE il file di origine e il numero di riga del punto di interruzione. L'IDE quindi visualizza la posizione per te.

Quando eseguo il debug, talvolta aggiungo o elimina righe per risolvere un problema, quindi proseguo con il problema successivo. Ma le cose si fanno strane perché i punti di interruzione ora sembrano essere prima o poi di quanto mi aspettassi e, se imposto nuovi punti di interruzione, non sono effettivamente sulla linea di origine su cui li ho impostati. Quando ciò accade, riavvio il programma e quindi sia l'IDE che la JVM sono di nuovo coerenti.

Problemi correlati