调用整个应用程序的图表

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

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

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

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

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

最诚挚的问候,Sarge

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

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

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

中士,

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

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

对于逼真的调用图,1.5 GB的内存不是很大。 我猜Soot只是给你你想要的东西。 其他工具的调用图可能更小,但随后它们可能不完整。

查看http://semmle.com/

我在测试版中使用了他们的工具。 它构建了一个程序信息数据库,您可以通过编程方式进行查询。 该公司是一家初创公司,该产品已不再处于测试阶段,但我无法在其网站上的任何地方找到如何购买或产品费用。

NDepend( http://www.ndepend.com/ )是一个类似的.NET工具,我也用过,但我不确定是否可以以编程方式访问它。 XDepend( http://www.xdepend.com/ )是他们的Java工具,我没有使用过。