2011-02-09 3 views
18

Что я хотел бы сделать, это сканировать набор классов Java и трассировать все вызовы методов из определенного метода абстрактного класса, и в этом контексте построить список всего кода, который выполняет некоторую операцию (в этом случае экземпляр экземпляра определенного класса). Я хочу знать, номер строки и предоставленные аргументы.Статический анализ графика вызовов Java

Я начал смотреть на BCEL, но, похоже, он не построил трассировку графика вызовов? Я не решаюсь написать свой собственный, потому что получение перегрузок, подписи типов и полиморфная отправка права могут быть сложными.

Я предположил, что код инструмента или примера существует, но я еще ничего не нашел. Мне действительно кажется, что я собираюсь изобрести колесо. Но если я это сделаю, это будет колесо с открытым исходным кодом и доступно на GitHub ;-)

PS: Вы найдете существующий вопрос «How to Generator a Java Call Graph», потому что он звучит одинаково, но это совсем не то, что мне нужно.

+1

На самом деле, кажется, что вторая часть принятого ответа (об обнаружении всех ссылок) - это, по сути, то, что вы хотите. –

+0

Мне нужен код, который делает это как часть автоматизированных процессов. –

+1

Марк, вы все получали эту работу с сажей? Я, к сожалению, не смог, поскольку я не смог установить точку входа успешно в классе, у которого нет основного метода. Как вы с этим справились? – Joeblackdev

ответ

2

Похоже, вы хотите что-то, что обеспечивает доступ к абстрактному синтаксису и полной таблице символов. Затем выборочное сканирование АСТ функций в графе вызовов, внедренных в каждый метод реализации (как указано в таблицах символов) абстрактного метода, дает вам возможность найти новую операцию, тип которой представляет собой определенный класс интересов.

DMS Software Reengineering Toolkit - обобщенная технология компилятора, обеспечивающая основные сервисы анализа, построение/навигация АСТ, построение/навигация таблицы символов, поток управления, поток данных и построение графика вызовов. DMS имеет необязательный Java Front End, который предоставляет полный парсер Java, строит Java AST и таблицы символов и может построить граф вызовов. Интерфейс Java Front End также может читать файлы .class; вам было неясно, хотите ли вы влезть в файлы классов, тоже охотясь за информацией.

Ответ, который вы хотите, находится не на полке. Вам нужно создать собственный код для реализации идей в первом абзаце, но DMS может обеспечить большую часть исходного материала. Он не содержит много деталей из файлов .class (они используются в основном для разрешения типов в исходном коде).

4

Сажа позволит вам легко добиться того, что вы ищете: http://www.sable.mcgill.ca/soot/

Можно построить точные графы вызовов полностью автоматически.

Вы можете найти всю необходимую документацию здесь: http://www.sable.mcgill.ca/soot/tutorial/index.html

Кроме того, есть активный список рассылки для Сажа.

+0

У меня есть jimple из apk, но не удалось построить граф вызовов с помощью командной строки. Требуется помощь. –

4

Вы можете попробовать JavaDepend, он предоставляет множество функций, необходимых для зависимостей и показателей, он также предоставляет CQL, как SQL, для запроса вашей базы кода.

5

Вы можете использовать набор инструментов java-callgraph, чтобы создавать достаточно точные статические и динамические callgraphs для Java.

Смежные вопросы