2011-02-09 11 views
18

Co chcę zrobić, to zeskanować zestaw klas Javy i śledzić wszystkie wywołania metod z określonej metody klasy abstrakcyjnej iw tym kontekście utworzyć listę wszystkich kodów, które wykonuje pewną operację (w tym przypadku tworzy instancję pewnej klasy). Chcę wiedzieć, numer wiersza i podane argumenty.Analiza statyczna wykresu wywołań Java

Zacząłem patrzeć na BCEL, ale wydaje się, że nie ma wbudowanego śledzenia połączeń? Waham się pisać samemu, ponieważ uzyskanie przeciążenia, podpisów typu i wysyłania polimorfów może być trudne.

W połowie oczekiwałem istnienia narzędzia lub kodu przykładowego, ale jeszcze nie znalazłem. Naprawdę czuję, że mam zamiar wymyślić koło. Ale jeśli to zrobię, będzie to otwarte koło źródłowe i dostępne na GitHub ;-)

PS: Znajdziesz pytanie "How to Generator a Java Call Graph", ponieważ brzmi to identycznie, ale to wcale nie jest to, czego potrzebuję.

+1

W rzeczywistości wygląda na to, że druga część zaakceptowanej odpowiedzi (o znalezienie wszystkich referencji) jest w rzeczywistości tym, czego potrzebujesz. –

+0

Potrzebuję kodu, który robi to jako część automatycznego procesu. –

+1

Mark, czy każdy z was pracował z sadzą? Niestety nie udało mi się, ponieważ nie udało mi się pomyślnie ustawić punktu wejścia w klasie, która nie ma głównej metody. Jak sobie z tym poradziłeś? – Joeblackdev

Odpowiedz

2

Wygląda na to, że chcesz coś, co zapewnia dostęp do abstrakcyjnej składni i pełnej tablicy symboli. Następnie niestandardowe skanowanie AST dla funkcji na wykresie wywołania zakorzenionym w każdej metodzie implementacji (wskazanej w tabelach symboli) metody abstrakcyjnej daje szansę zlokalizowania nowej operacji, której typem jest konkretna klasa zainteresowań.

The jest uogólnioną technologią kompilatora zapewniającą podstawowe usługi analizowania, budowania/nawigacji AST, budowania/nawigacji tablic symboli, sterowania przepływem, przepływu danych i tworzenia wykresów połączeń. DMS ma opcjonalny Java Front End, który zapewnia pełny analizator składni Java, buduje Java AST i tabele symboli i może tworzyć wykres wywołań. Java Front End może również czytać pliki .class; nie wiedziałeś, czy chcesz wejść do plików klasowych, polując na informacje.

Pożądana odpowiedź nie jest niedostępna. Musisz utworzyć niestandardowy kod do implementacji pomysłów w pierwszym akapicie, ale DMS może dostarczyć większość surowca. Nie dostarcza zbyt wielu szczegółów z plików .class (są one używane głównie do rozwiązywania typów w kodzie źródłowym).

4

Sadza powinny pozwalają łatwo osiągnąć to, czego szukasz: http://www.sable.mcgill.ca/soot/

Można skonstruować precyzyjne wykresy połączeń w pełni automatycznie.

można znaleźć wszystkie niezbędne dokumenty tutaj: http://www.sable.mcgill.ca/soot/tutorial/index.html

Ponadto, istnieje aktywna lista dyskusyjna dla sadzy.

+0

Mam jimple z apk, ale nie jest w stanie zbudować wykres połączeń za pomocą wiersza polecenia. Wymagana pomoc. –

4

Możesz spróbować JavaDepend, daje wiele funkcji wymaganych dla zależności i metryk, zapewnia również CQL jak SQL, aby zażądać bazy kodu.

5

Możesz użyć zestawu narzędzi java-callgraph do stworzenia wystarczająco dokładnej statycznej i dynamicznej kaligrafii dla Javy.