2010-02-26 15 views
7

W moim projekcie instrumentacji kodu bajtowego często wpadam na VerifyErrors. Jednak domyślny weryfikator java podaje niewiele informacji o tym, która instrukcja spowodowała błąd (podaje tylko metodę i małą wiadomość). Czy istnieje jakiś samodzielny weryfikator kodu bajtowego, który zapewnia nieco bardziej zaawansowaną pomoc w lokalizowaniu błędu, a przynajmniej dokładną lokalizację instrukcji? Dziękuję Ci.Autonomiczny weryfikator kodu bajtowego

Odpowiedz

2

Tak jak w przypadku każdego projektu związanego z kodem bajtowym JVM, najpierw sprawdziłbym, czy BCEL ma coś, co może być przydatne dla ciebie. Pomocne może być również FindBugs - choć nie jestem pewien, czy zakłada on, że kod weryfikowalny ma się zaczynać, czy nie.

+1

Dlaczego o tym nie pomyślałem. W rzeczywistości używam BCEL, ale nigdy nie zdarzyło mi się, aby sprawdzić jego weryfikatora. W rzeczywistości ma on nazwę JustIce. –

2

Byłem też szukają czegoś, co byłoby zgłaszać potencjalne zweryfikować błędy, ale szczególnie IncompatibleClassChangeError s. Napisałem mały projekt testowy z jedną klasą API i kolejnymi metodami API wywołującymi klasę klienta oraz główną klasą do uruchomienia weryfikatora; następnie zmienił API, rekompilował go, ale nie klienta, i sprawdził, co może zostać przechwycone. Używane -target 7, chociaż nie ma specjalnych funkcji JDK 7 na teraz.

Po pierwsze i najbardziej oczywiste, Class.forName może znaleźć pewne błędy w sygnaturze klasy klienta, ale nie wydaje się sprawdzać ciał metod dla wywołań do nieistniejących metod API i tym podobnych, nawet jeśli wywołasz getDeclaredMethods; błędy są zgłaszane przez VM tylko wtedy, gdy problematyczny wiersz kodu jest faktycznie uruchamiany.

Justin w BCEL 5.2 wydaje się najłatwiejszy;

org.apache.bcel.verifier.Verifier.main(new String[] {clazz}); 

spełnia swoje zadanie:

Pass 3a, method number 1 ['public void m()']: 
VERIFIED_REJECTED 
Instruction invokestatic[184](3) 4 constraint violated: 
    Referenced method 'x' with expected signature '()V' not found in class 'API'. 
    .... 

próbowałem ASM 4.0, ale

org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz}); 

nie działa; być może sprawdza format metod, ale nie łączy. Podpisywanie main i przekazywanie checkDataFlow=true nie pomaga.

Wyszukiwanie, Znalazłem także https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java, ale nie mogłem znaleźć żadnego sposobu, aby to zadziałało; towarzyszący test jednostkowy rzuca po uruchomieniu ClassNotFoundException.

Powiązane problemy