График вызовов всего приложения - PullRequest
19 голосов
/ 29 января 2010

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 01 февраля 2010

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

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

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

2 голосов
/ 31 января 2010

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

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

1 голос
/ 01 февраля 2011

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

1 голос
/ 01 февраля 2010

Выезд http://semmle.com/

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

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

...