整个应用程序的调用图

有没有一个非玩具工具可以创建整个应用程序的调用图?我并不是说只是通过逐个方法指向来获取图片或绘制调用图。

我需要一个调用图,它可以通过编程方式访问,即该工具应该以文本模式将其刷新到文件(例如.XML)或在内存中构建调用图(这对于大型应用程序来说会成为问题)。在数据库中构建的调用图会很棒。

静态和动态调用图都有需求;虽然静态的一个更有趣,但它过度适应的事实是可以接受的。

到目前为止,我已经尝试过烟灰。但是,它甚至无法处理像FreeCol这样的中型项目(java源代码可用)。Soot 会耗尽该项目上的 1.5GB 内存,然后 JVM 崩溃,如下所述:http://www.sable.mcgill.ca/pipermail/soot-list/2008-July/001828.html

如上所述,任何人都可以建议一种工具来生成呼叫图吗?Java或.NET语言是可以的。


答案 1

我们的 DMS 软件再造工具包可以为 C、Java 和 COBOL 构建全局调用图。这些被计算为内存中的数据结构,然后可以步行以收集任意的其他事实。(你可以把它导出到其他一些工具上去浏览它,但是对于一个大的调用图,导出的时间和精力将主导分析它的时间,所以我们倾向于不导出它。YMMV.)。

从抽象形式的“CALL X(...)”的语句中提取调用图信息相对容易,因为目标X就在调用站点的代码中。间接(虚拟或方法调用)存在问题,因为实际的调用目标并非平凡地存在于调用站点的代码中,而是实际上分散在整个系统中,更糟糕的是,由运行时条件控制。在没有任何附加信息的情况下,调用图构造函数必须假设间接调用可以转到具有匹配签名的任何目标;这在图中引入了许多误报呼叫弧。

DMS 使用(保守的)全局点到分析作为调用图提取过程的一部分,以确定此类间接调用的去向,同时最大限度地减少误报。有关 DMS 可以提取的内容的更多示例,以及从包含 250,000 个函数的系统中提取的示例图形,请参阅流分析和调用图。


答案 2

JProfiler是一个不错的Java分析器,它将生成调用图,并允许您以XML格式导出它。

我没有使用 Soot ,所以我不能评论 JProfiler 与 Soot 相比如何,但预计与应用程序相比,JProfiler 需要 2.5-3 倍的内存。


推荐