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;
}
}
Questo non sospende la VM, ma stamperà una traccia di stack ogni volta che viene eseguita la parte di codice. – Sentry
@Sentifica chiarificata risposta – artbristol
Ora è logico :) – Sentry