График вызова всего приложения
Есть ли неигровый инструмент, который может создать график вызовов всего приложения? Я не имею в виду просто получить картинку или нарисовать граф вызовов с помощью наведения метода на метод.
Мне нужен граф вызовов, который доступен программно, т.е. инструмент должен сбросить его в файл в текстовом режиме (например, XML) или построить граф вызовов в памяти (что становится проблематичным для большого приложения). Граф вызовов, встроенный в БД, был бы великолепен.
Как статические, так и динамические графы вызовов востребованы; хотя статический является немного более интересным, тот факт, что он является чрезмерно оживленным, является приемлемым.
Я пробовал сажи до сих пор. Тем не менее, он не способен обрабатывать даже проекты среднего размера, такие как FreeCol (доступны исходники java). Сажа истощает 1,5 ГБ памяти в этом проекте, а затем происходит сбой JVM, как описано здесь: http://www.sable.mcgill.ca/pipermail/soot-list/2008-July/001828.html
Может ли кто-нибудь предложить инструмент для генерации графа вызовов, как описано выше? Java или .NET языки в порядке.
Ответы
Ответ 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 ГБ - это не очень много памяти для реалистичных графиков вызовов. Думаю, Саот просто дает вам то, о чем вы просите. Графы вызова другими инструментами могут быть меньше, но тогда они, вероятно, будут неполными.