整个应用程序的调用图

19 .net java architecture refactoring reverse-engineering

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

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

静态和动态呼叫图都是需求的; 虽然静态更有趣,但事实是它过于活跃是可以接受的.

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

如上所述,有人可以建议生成调用图的工具吗?Java或.NET语言都可以.

Ira*_*ter 7

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

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

DMS使用(保守的)全局点分析作为调用图提取过程的一部分,以确定此类间接调用的去向,同时最小化误报.有关DMS可以提取的更多示例,请参阅流程分析和调用图表,以及从250,000个函数的系统中提取的示例图表.


raj*_*air 2

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

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

  • 动态分析器只能构造执行期间实际遍历的调用图部分。为了获得半完整的图表,您需要非常彻底地测试系统,并且考虑到大多数测试套件只能达到 70-80%,因此将会有相当多的可能的调用根本没有列出。动态分析给出了“低估”。静态分析器(参见我的答案)通过检查代码来找出调用图。由于任何安全分析都必须是保守的,因此静态分析器给出的结果是“高估”,但它不会错过任何潜在的调用。 (2认同)