2012-04-20 15 views
7

Próbuję skonfigurować warunkową przerwania w kodzie dekompilować, ale Eclipse wciąż daje mi ten błąd:Zerwane warunkowe punkty przerwania Eclipse?

Conditional breakpoint has compilation error(s)

Reason: Evaluations must contain either an expression or a block of well-formed statments

Moja sprawa jest dość prosta, po prostu staramy się porównać z wartością strun. Próbowałem wszystkie z poniższych kryteriów i pojawiają się błędy z każdego z nich:

myObj.toString() == "abc123" 
myObj.toString().equals("abc123") 
if(myObj.toString() == "abc123"){ return true; } 
true == true 

Próbowałem również każdą kombinację posiadające lub nie posiadające średnik na końcu linii (S) i każda kombinacja odstępów i linii początkowych oraz każdej kombinacji posiadania lub braku {} otaczającego mój stan. Zasadniczo, nie mam pojęcia, dlaczego to nie działa ...

Kod, który próbuję debugować jest wewnątrz słoik, który jest dekompilowany z JD-Eclipse. Normalne punkty przerwania działają dobrze w tym kodzie.

Czy ktoś wie, co się tutaj dzieje?

+0

Czy przekompilowałeś słoik z dekompilowanego źródła, w przeciwnym razie kod nie będzie zgodny z słojem, np. zmienne lokalne – vickirk

+0

Hmm, ale dostaję inny błąd, mówiąc, że nazwy zmiennych są nieprawidłowe, gdy próbuję użyć nazwy zmiennej, która nie istnieje w źródle ... – kand

+0

Pierwszym krokiem jest ustalenie, czy problemem jest dekompilacja. Czy ustawienie warunkowego punktu przerwania w "normalnym" kodzie w projekcie Eclipse działa? – sharakan

Odpowiedz

2

Ta strona zawiera definicję właściwej definicji CBP i najczęstsze powody, dla których nie powinna działać. W twoim przypadku, myślę, że obowiązuje:

This can happen if you are setting a breakpoint in a class whose class file does not contain a local variable table. For example, let's say you want to set a conditional breakpoint on Class.forName(String). If you have a source attachment for rt.jar the content assist will allow you to refer to the argument by its variable name, className. However, at debug runtime, the variable name will only be known if the class file contains a local variable table. Depending on the options used at compilation time, this information may have been stripped from the class file.

JD mogły sfabrykowane nazw zmiennych podczas decompiling Twój słoik, więc stosując „myObj” w wyrażeniu warunkowym powoduje błąd kompilacji.

+2

Brzmi obiecująco, ale OP najwyraźniej próbował prawdziwego znaku == true, który powinien działać, nawet jeśli zmienna imiona są zmazane! – sharakan

+0

@sharakan Masz rację! To jest dziwne. Nie wiesz, co może być nie tak z prawdą == true. – mazaneicha

+0

@mazaneicha Na tej stronie FAQ nie ma żadnych treści. Czy jest jakiś sposób, abym mógł zobaczyć tabelę przygotowaną dla mojego pliku klasowego? – kand

1

Może to być błąd w Eclipse. To, co robi zaćmienie, polega na przeplataniu nowej metody lub czegoś w źródle pliku, dla którego ustawiłeś punkt przerwania i kompilujesz go. Jeśli coś pójdzie nie tak w tym procesie, twój warunkowy punkt przerwania w tajemniczy sposób zawodzi.

Można śledzić podejście użyłem poniżej, bieganie zaćmienie w debugowania, aby spróbować wyśledzić problemu: -

https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232#c21

0

W przypadku „true == true” warunek należy po prostu dodać zwrot oświadczenie:

return true == true; 

Dla pozostałych problemów brakująca tabela zmiennych lokalnych powinna być wyjaśnieniem. +1 do Mazaneicha za to.

0

W przypadku „true == true” warunek należy po prostu dodać instrukcję RETURN:

return true == true; 

Dla reszty problemów brakujących zmiennej lokalnej tabeli powinno być wyjaśnienie. +1 do Mazaneicha za to.

Jeśli próbujesz skierować metody argument jego nazwa to po prostu spróbować, aby zmienić nazwę na „arg0”, „arg1” itp

Na przykład, można zrobić tak:

arg0 == null 

Łatwo odgadnąć nazwę zmiennej.Po prostu wstaw niepoczytalny punkt przerwania i zobacz listę zmiennych w widoku Zmienne.

0

Po prostu sumuję to, co może pomóc innym, ponieważ właśnie to rozwiązałem po pewnym czasie. Używam też JD-Eclipse do debugowania, gdy pojawia się ten problem.

Upewnij się, że wszystkie niezbędne pliki JAR znajdują się w ścieżce Classpath. Twoje zdanie warunkowe może być bardzo proste, na przykład "return true"; ale po zaznaczeniu pola wyboru "warunkowy punkt przerwania" może to być (nie jestem tego pewien). Debugger Eclipse sprawdzi, czy ścieżka klas projektu Eclipse ma większy zasięg, a nie tylko linię "return true".

Odkąd używam JD-Eclipse, nie zawracałem sobie głowy dodaniem wszystkich niezbędnych plików JAR. Problem został rozwiązany po Dodałem pliki jar w classpath projektu

Jeśli używasz zdalnego debugowania, można także spróbować skonfigurować tak, że JDK swój projekt Eclipse jest kompatybilny z JRE JVM docelowego użytkownika.

Powiązane problemy