2011-10-16 3 views
10
if (true) { 
    String a = "foo"; 
    String b = "bar"; 
} 

Se ho impostato un punto di interruzione String a = "foo"; eclisse si fermerà, e posso scavalcare e vedere il valore di a all'interno della finestra variabili. Ma non posso scavalcare la seconda affermazione, lascia solo il blocco di codice e non vedo mai il valore di b.Impossibile breakpoint l'ultima istruzione di un blocco di codice in Eclipse

Questo mi costringe ad aggiungere una dichiarazione di noop dopo String b = "bar"; solo così posso vedere cosa contiene b. Non riesco nemmeno ad aggiungere un punto di interruzione sul numero } di chiusura che, a mio avviso, potrebbero essere problemi correlati.

So che Visual Studio consente questo, quindi c'è un modo per farlo in Eclipse?

+1

Sei assolutamente sicuro che stai eseguendo il debug della stessa * versione * della classe? Ad esempio, a seconda del tuo strumento di costruzione, se hai più progetti e il tuo principale è in un altro progetto rispetto a questa fonte, potrebbe essere in esecuzione una vecchia copia che ha linee diverse di codice – Bohemian

+0

L'esempio sopra è stato testato e sono sicuro di esso, puoi provarlo tu stesso. Imposta il punto di interruzione su 'String a =" pippo "; usa F6 per scavalcare, vedrai il valore di" a ", usa di nuovo F6 e salterai fuori dal blocco di codice. Non si arriva mai a vedere il valore di 'b' – rtaranu

+0

Duplicato di http://stackoverflow.com/questions/7785887/cant-breakpoint-the-last-statement-of-a-code-block-in-eclipse – Stefan

risposta

-1

Onestamente non sono sicuro di cosa sta succedendo nell'installazione di Eclipse. Sto lavorando in Java e ho appena provato tutto quello che riesco a pensare. Ho controllato un metodo statico per il punto di interruzione sull'ultima riga che è non a } e funziona perfettamente. Ho controllato lo stesso per un metodo non statico.

si rompe in questo modo: non si può punto di interruzione in un vicolo parentesi graffa, ma questo verrà impostato a tutto ciò che è sotto la parentesi graffa, line-saggio. Quindi, se si dispone di una funzione annidata:

public int DoesStuff(int x, int y) { 
    if(x > y) { 
     DoThing; 
    } 
    else { 
     DoOtherThing; 
    } 
} 

Poi gli ultimi due parentesi graffe non possono essere rompere punte, ma DoThing e DoOtherThing can. Ha senso?

+0

Credo quello che stai dicendo è corretto, ma non risponde alla domanda. Il suo problema sembra essere che l'ultima istruzione * prima * la parentesi finale '}' non può avere un punto di rottura e viene saltata quando si passa. – Rob

+0

Posso interrompere il 'DoThing' o' DoOtherThing', in modo che si interrompa prima che la funzione venga eseguita. Ma se quelle funzioni restituiscono un valore che viene assegnato ex: 'int myInt = DoThing()' e lo passo, non riesco a vedere il valore assegnato a 'myInt'. La prossima "pausa" sarà al di fuori del blocco di codice. – rtaranu

+1

@Duckies In realtà si * può * breakpoint su un metodo che chiude parentesi graffa - vedere la mia risposta. –

4

È possibile evidenziare l'espressione sul lato destro della cessione e premere Ctrl + Maiusc +I (per 'controllare' credo). Valuterà l'espressione e ti darà il risultato. In questo modo è possibile conoscere il valore di b senza aver bisogno di un punto di interruzione dopo l'assegnazione.

+1

Grazie, funziona, sembra solo un kludge. – rtaranu

+0

@rtaranu: Non penso che sia un kludge, mi sembra molto sensato. Poiché il debugger non può rompere su un '}', e poiché l'ultima istruzione di assegnazione non è stata ancora eseguita quando ci si interrompe, è molto logico interromperla comunque a quel punto e lasciare che il debugger valuti la destra lato dell'espressione per te. – Rob

+0

@robjb: è un kludge, perché se il lato destro dei compiti ha effetti collaterali (funzione che modifica lo stato del programma), allora verrà valutato una volta così posso vedere il valore, e poi di nuovo una volta I lascia che il programma continui. Quindi modifico il comportamento del programma quando lo controllo. – rtaranu

-1

Se l'istruzione finale è un'assegnazione e si trova sulla variabile locale, perché si desidera vedere il suo valore perché non sarà più in ambito e non può avere effetto.

Se si imposta lo stesso attributo di classe, è possibile visualizzarlo quando si torna da questa chiamata e si dispone dell'oggetto su cui questo metodo ha funzionato.

Sebbene questo non risponda alla domanda, ma sto cercando di capire il caso d'uso del problema.

+0

Il caso d'uso è che sto chiamando una funzione scarsamente documentata in una libreria di terze parti e voglio vedere cosa restituisce. Oppure sto scrivendo del codice e voglio ricontrollare il valore prima di continuare a scrivere. – rtaranu

+0

Per la funzione che si trova nella libreria di terze parti, è possibile valutare la chiamata di funzione semplicemente mettendo l'orologio o facendo ispezionare. Quindi quando scrivi il codice ya questo problema sarà lì :). – Aman

+0

Non è correlato all'ambito delle variabili (beh, un po ', dal momento che il punto di interruzione deve essere impostato in un punto prima che la pulizia sia stata eseguita). Se Eclipse non può impostare un breakpoint su un '}', questo è un problema di Eclipse e non una limitazione tecnica. I debugger in generale possono benissimo spezzarsi su un "}", ad es. Visual Studio fa. –

14

Per impostare un punto di interruzione alla fine di un blocco arbitrario non è possibile (senza hacking di codice byte).

Se si tratta di un corpo metodo, allora è possibile: è possibile impostare un metodo punto di interruzione. A tale scopo, fare doppio clic sulla linea di metodo di definizione:

sample code with simple method breakpoint

(preavviso la piccola freccia?) e poi nella vista i punti di interruzione, selezionare il punto di interruzione per vedere sia un Entry ed un Exit un'opzione tick-box nelle proprietà visualizzate:

modifying the breakpoint

La piccola freccia indica che, per impostazione predefinita, abbiamo istituito un punto di interruzione su voce al metodo.

Ora selezionate Exit (e deselezionare Entry) e vedrete questo nei punti di interruzione vista:

exit breakpoint in breakpoints view

(C'è una freccia po 'diverso, indicando un punto di interruzione uscita.)

Ora eseguire il debugger su questo piccolo interruttore ('Debug come applicazione Java') e si fermerà sulla parentesi di uscita del metodo:

debugger stopped

e le variabili locali (solo a in questo caso) sono ora visibili (con i valori corretti) nei Variabili vista:

variables just before exit

Va notando che questo tipo di metodo di trap di breakpoint esce comunque, anche se, ad esempio, si esce dall'eccezione.

+0

Vedere [questa risposta] (http://stackoverflow.com/questions/198041/eclipse-beakpoint-stop-before-leaving-a-java-method?rq=1) che non ho trovato fino a quando ho guardato: - (È un vecchio consiglio, e il mio è leggermente diverso, essendo per Eclipse 3.7.2 –

+0

In IntelliJ sono in grado di posizionare break-points alla fine di blocchi di codice arbitrari (non necessariamente metodi). codice byte hacking "sotto il cofano? –