2015-01-24 3 views
11

Supponiamo che ho una classeimpostare un (metodo) breakpoint per un particolare oggetto (e non tutte le istanze di quel tipo) in java

public class Foo 
{ 
    public void doThing() { ...} 
} 

Dire che ho un sacco di casi di Foo, ma io sono solo particolarmente interessato a uno di loro.

Come dovrei "taggare" quell'istanza e impostare un "punto di interruzione condizionale" in doThings che si fermerebbe SOLO per l'istanza contrassegnata? Esiste un modo "builtint", in particolare dal debugger di Eclipse, per fare ciò?

Attualmente, devo creare manualmente un flag booleano nella classe impostandolo su false per impostazione predefinita e creare un punto di interruzione condizionale basato su quello in doThings. Quindi, quando incontro l'oggetto interessato, imposto il flag su true eseguendo il codice setter nella finestra Display.

Ma chiaramente, ciò richiede la modifica del codice e l'aggiunta di alcune piastre, il che non è sempre possibile o una buona cosa da fare.

+2

io non sono sicuro che è quello che stanno chiedendo, in ogni caso, la funzione è stato disponibile per molto tempo. Avvia il debug e quando il punto di interruzione si arresta sull'istanza dell'oggetto desiderata, fai clic su "questo" nella vista delle variabili di debug, quindi su "punti di interruzione dell'istanza"; ottieni l'elenco delle istanze dal vivo e puoi scegliere in che modo limitare il punto di interruzione –

+0

@guido Sembra proprio quello che mi sta chiedendo. Dovresti aggiungerlo come risposta. – erickson

+0

@erickson non sono sicuro perché questo funziona solo in runtime dopo aver avviato le sessioni di debug e l'istanza è già disponibile, sembra che voglia decidere quale istanza è prima, al momento della compilazione –

risposta

8

Sì, c'è esempio i punti di interruzione in Eclipse.

dovete mettere un punto di interruzione comune nella classe desiderata e, nel pannello variabili, è fare clic destro sul istanza e scegliere Instance punti di interruzione.

Instance Breakpoints

Un popup vi chiederà quale punto di interruzione si desidera attivo per tale istanza.

Popup Selection

Si sceglie ed è fatta!

Done

+0

Grazie, penso che questo faccia il trucco! –

1

Non conosco alcun modo "corretto", ma un approccio sarebbe chiamare hashCode() nella finestra di controllo quando lo si crea per la prima volta e quindi rendere il punto di interruzione condizionale allo hashCode(). Quindi dovresti cambiare il punto di interruzione ogni volta che lo hai eseguito - un po 'fastidioso, ma almeno ti dà un valore costante che puoi usare per riferirti all'oggetto. (Supponendo che la classe non abbia la priorità su hashCode(), se hai molte istanze con lo stesso codice hash, ciò rende le cose più complicate.)

2

Non è il modo più pulito, ma puoi impostare un punto di interruzione condizionale su l'output Object#toString predefinito dell'istanza.

Dopo aver ottenuto il risultato di default toString() dell'istanza, aggiungere qualcosa come il seguente come condizione breakpoint nel metodo doThing:

this.toString().equals("[email protected]") 
+0

Bene, questo dipende da 'toString' NON essere sovrascritto. Ma grazie, per la risposta! –