Подтвердить что ты не робот

График вызова всего приложения

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

Мне нужен граф вызовов, который доступен программно, т.е. инструмент должен сбросить его в файл в текстовом режиме (например, XML) или построить граф вызовов в памяти (что становится проблематичным для большого приложения). Граф вызовов, встроенный в БД, был бы великолепен.

Как статические, так и динамические графы вызовов востребованы; хотя статический является немного более интересным, тот факт, что он является чрезмерно оживленным, является приемлемым.

Я пробовал сажи до сих пор. Тем не менее, он не способен обрабатывать даже проекты среднего размера, такие как FreeCol (доступны исходники java). Сажа истощает 1,5 ГБ памяти в этом проекте, а затем происходит сбой JVM, как описано здесь: http://www.sable.mcgill.ca/pipermail/soot-list/2008-July/001828.html

Может ли кто-нибудь предложить инструмент для генерации графа вызовов, как описано выше? Java или .NET языки в порядке.

4b9b3361

Ответ 1

Наш DMS Software Reengineering Toolkit может создавать глобальные графики вызовов для C, Java и COBOL. Они вычисляются как структура данных в памяти и затем могут быть собраны для сбора произвольных других фактов. (Вы можете экспортировать его в какой-то другой инструмент, чтобы пройтись по нему, но для большого графика вызовов время и усилия на экспорт будут доминировать во времени, чтобы просто проанализировать его, поэтому мы склонны не экспортировать его. YMMV.).

Относительно легко извлекать информацию из списка вызовов из инструкции абстрактной формы "CALL X (...)", поскольку цель X находится прямо там в коде на сайте вызова. Косвенные (виртуальные вызовы или вызовы методов) проблематичны в том, что фактические цели вызова не являются тривиально в коде на сайте вызова, но фактически разбросаны по всей системе и хуже, контролируются условными выражениями времени выполнения. В отсутствие какой-либо дополнительной информации конструктор графа вызовов должен принять косвенный вызов, который может перейти к любой цели с соответствующей сигнатурой; это вводит множество ложноположительных дуг вызова в графе.

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

Ответ 2

JProfiler - неплохой Java-профилировщик, который генерирует граф вызовов, а также позволяет экспортировать его в формат XML.

Я не использовал Soot, поэтому я не могу комментировать, как обстоят дела с JProfiler по сравнению с Soot, но ожидаю, что JProfiler потребует в 2,5-3 раза больше памяти по сравнению с приложением.

Ответ 3

Отъезд http://semmle.com/

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

NDepend (http://www.ndepend.com/) - это аналогичные инструменты для .NET, которые я также использовал, но я не уверен, что можно получить доступ он программно. XDepend (http://www.xdepend.com/) является их инструментом для Java, который я не использовал.

Ответ 4

1,5 ГБ - это не очень много памяти для реалистичных графиков вызовов. Думаю, Саот просто дает вам то, о чем вы просите. Графы вызова другими инструментами могут быть меньше, но тогда они, вероятно, будут неполными.