2013-01-17 8 views
9

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; 
     } 
    } 

Odpowiedz

5

To dość obrzydliwe i prawdopodobnie powolny, ale można użyć

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

jako warunek punktu przerwania.

Na podstawie tego błędu https://bugs.eclipse.org/bugs/show_bug.cgi?id=72961 nie sądzę Eclipse będzie ją wspierać bezpośrednio

+0

To nie wstrzymuje maszyny wirtualnej, ale wyświetla ślad stosu za każdym razem, gdy wykonywany jest ten fragment kodu. – Sentry

+0

@Sentry wyjaśnił odpowiedź – artbristol

+0

Teraz ma sens :) – Sentry

0

Eclipse może to zrobić. Utwórz punkt przerwania, a następnie przejdź do perspektywy debugowania i do widoku "Punkty przerwania". Wybierz przerwania i

Nie można powiedzieć enable „warunkowy” i wybierz „Zawiesić gdy zmiany wartości”

Następnie trzeba wpisać wartość w polu poniżej, w twoim przypadku prawdopodobnie „minimum”.

Edit:

Próbowałem tylko, że i to nie działa zgodnie z oczekiwaniami, ale znalazłem inne rozwiązanie, które mogą pracować:

data breakpoints in java/eclipse

Podsumowując: Tworzenie punkt przerwania w linii, w której zdefiniowane jest twoje pole, stanie się punktem obserwacyjnym. W "Właściwości punktu przerwania" można określić, aby tylko zawiesić przy zmianie (symbol na marginesie będzie pisakiem), a nie przy dostępie (symbol będzie parą okularów).

+0

do swojego pierwszego postu, to trochę nieporozumienie. Wartość nie jest ustawiona na "minimum", ale sama nosi nazwę "minimum", na przykład 'public int minimum = 0'. I muszę zawiesić, gdy wartość jest ustawiona przez jakiś inny obiekt klasy dokładnej. Do twojej edycji, tak, próbuję użyć punktu obserwacyjnego, jak sugerujesz.Problem polega na tym, że wartość zmienia się bardzo często przez wiele obiektów i program jest zawieszany, nawet gdy nie chcę. Dziękuję za poświęcony czas! – Radium

+0

Rozumiem, że 'minimum' to nazwa pola, ale w jakiś sposób zwróciło to moją uwagę, że chcesz tylko przechwycić zmiany z określonej klasy. Myślałem, że chodzi tylko o "zmianę" a "dostęp". Więc tak, myślę, że artbristol dał poprawną odpowiedź. – Sentry

Powiązane problemy