Próbuję śledzić zmianę wartości przy użyciu punktu kontrolnego w programie Java w debugerze Eclipse. Hierarchia klas jest dość skomplikowana, a wartość, którą śledzę, jest zawijana w kontener, który jest używany w wielu miejscach.Warunkowy punkt przerwania przez wywołującego w środowisku Java eclipse
Mówiąc dokładniej, istnieje pojemnik SizeRequirement
, który ma właściwość minimum
, którą śledzę. Ta klasa jest używana przez wielu menedżerów układu w wielu miejscach dla wielu komponentów, aby zdefiniować wymagania dotyczące rozmiarów komponentów. Muszę złapać dokładne połączenie, w którym wartość zmienia się/jest ustawiona dla jednego konkretnego menedżera układu i jednego określonego komponentu w nim. Czy można filtrować punkty przerwania przez osobę dzwoniącą? Postaram się wyjaśnić problem używając jakiś abstrakcyjny kod:
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";
}
}
ustawić watchpoint na value
i chcę tylko przerwania zawiesić tylko wtedy, gdy jest ustawiony przez value
klasy A i ignorowanie połączeń przez B.
Na domiar złego klasa SizeRequirement
jest częścią biblioteki swing i jest głęboko zintegrowana z kodem, więc nie mogę użyć dziedziczenia, aby zastąpić ją jakimś dzieckiem w pewnym miejscu, gdzie chcę go śledzić.
EDIT
Więc to co kiedyś jak warunkową warunek przerwania. Uwierz lub nie, działa. :)
StackTraceElement[] arr = Thread.currentThread().getStackTrace();
boolean contains = false;
for(StackTraceElement e : arr) {
if (e.getClassName().contains("A")) {
contains = true;
break;
}
}
To nie wstrzymuje maszyny wirtualnej, ale wyświetla ślad stosu za każdym razem, gdy wykonywany jest ten fragment kodu. – Sentry
@Sentry wyjaśnił odpowiedź – artbristol
Teraz ma sens :) – Sentry