2013-01-17 14 views
9

Sto cercando di tenere traccia di una modifica di un valore utilizzando il punto di controllo in un programma Java nel debugger Eclipse. La gerarchia delle classi è piuttosto complessa e il valore che sto monitorando è racchiuso in un contenitore, che viene utilizzato in molti posti.Punto di interruzione condizionale dal chiamante in Java eclissi

Per essere più specifici, c'è un contenitore SizeRequirement, che ha una proprietà minimum, che sto monitorando. Questa classe viene utilizzata da molti gestori di layout in molti posti per molti componenti per definire i requisiti per le dimensioni del componente. Ho bisogno di prendere la chiamata esatta, in cui il valore cambia/è impostato per uno specifico gestore di layout e un componente specifico in esso. È possibile filtrare i breakpoint dal chiamante? Cercherò di spiegare il problema utilizzando un codice astratto:

class ValueContainer { 
    public String value; 
} 

class A { 

    private ValueContainer valueContainer; 

    public A() { 
    valueContainer = new ValueContainer(); 
    valueContainer.value = "setByA"; 
    } 

} 

class B { 

    private ValueContainer valueContainer; 

    public B() { 
    valueContainer = new ValueContainer(); 
    valueContainer.value = "setByB"; 
    } 

} 

Ho impostato un watchpoint su value e voglio solo punto di interruzione per sospendere solo quando il value è impostato per classe A e ignorare le chiamate di B.

Per peggiorare le cose, la classe SizeRequirement fa parte della libreria swing ed è profondamente integrata nel codice, quindi non posso usare l'ereditarietà per sostituirla con qualche figlio su un punto esatto in cui voglio tracciarlo.

EDIT

Quindi questo è quello che ho usato come condizionale condizione di breakpoint. Credi o no, funziona. :)

StackTraceElement[] arr = Thread.currentThread().getStackTrace(); 
    boolean contains = false; 
    for(StackTraceElement e : arr) { 
     if (e.getClassName().contains("A")) { 
      contains = true; 
      break; 
     } 
    } 

risposta

5

è piuttosto disgustoso e probabilmente lento, ma è possibile utilizzare

Thread.currentThread().getStackTrace()[2].getClassName().contains("A") 

come la sua condizione punto di interruzione.

Sulla base di questo bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=72961 Non credo Eclipse sosterrà direttamente

+0

Questo non sospende la VM, ma stamperà una traccia di stack ogni volta che viene eseguita la parte di codice. – Sentry

+0

@Sentifica chiarificata risposta – artbristol

+0

Ora è logico :) – Sentry

0

Eclipse può farlo. Crea un punto di interruzione, quindi vai nella prospettiva Debug e nella vista "Punti di interruzione". Selezionare il punto di interruzione e

Non ci si può dire di abilitazione "con riserva" e selezionare "Sospendi quando cambia il valore"

È quindi necessario immettere il valore nel campo sottostante, nel tuo caso, probabilmente "minimo".

Edit:

ho appena provato e che non ha funzionato come previsto, ma ho trovato un'altra soluzione che potrebbe funzionare:

data breakpoints in java/eclipse

In sintesi: Creare un punto di interruzione nella linea in cui è definito il campo, diventerà un punto di controllo. Nella "Proprietà Breakpoint" è possibile specificarlo solo per sospendere la modifica (il simbolo sul margine sarà una penna), non per l'accesso (il simbolo sarà un paio di occhiali).

+0

Per il tuo primo post, questo è po 'equivoco. Il valore non è impostato su "minimo", ma si chiama "minimo", come "public int minimum = 0'. E ho bisogno di sospendere, quando il valore è impostato da qualche altro oggetto della classe esatta. Per la tua modifica, sì, sto cercando di utilizzare un punto di controllo, come hai suggerito.Il problema è che il valore è cambiato molto spesso da molti oggetti e il programma è sospeso anche quando non lo desidero. Grazie comunque per il tuo tempo! – Radium

+0

Capisco che 'minimum' è il nome del campo, ma in qualche modo mi è sfuggito di notare che vuoi solo prendere i cambiamenti da una certa classe. Ho pensato che si trattava solo di "cambiamento" vs "accesso". Quindi sì, penso che artbristol abbia dato la risposta corretta. – Sentry

Problemi correlati