我正在寻找一个简单的Java动态调用图记录器,您可以在几行代码中添加它。我知道有一个Aspect J solution。另外,我帮助Zola开发Glow for C/C++所以我可以重写一个类似的工具,但我不想深入研究JVM内部。
现在任何开源解决方案都比AspectJ解决方案稳定且更好?
目的是作为伴侣使用单元测试代码的某些部分,以获得有关其行为的更多信息。
答案 0 :(得分:1)
我认为您希望通过任何可能的方式收集呼叫图形(而不仅仅是一组呼叫)。
可以使用静态分析器(如果你可以获得足够强大的分析器)来收集潜在的调用图。动态方法通过检测代码在运行时收集一个。有些人可能特别想要动态的,因为他们希望看到一组特定输入数据的实际调用图。
有几个Java分析器会动态收集这些信息,包括ours。我所知道的那些人都不是开源的,但我可能是错的。
这种分析器通常通过检测代码(如果语言[例如,Java,C#]具有此类代码)来源代码或VM代码。他们如何做到这取决于供应商。 在我们的例子中,我们使用program transformation tools将源代码从其原始形式转换为也收集分析数据的表单。
您也可以使用AspectJ插入检测来执行此操作。 [值得注意的是,方面只是程序转换的一个特例]。当然,除了检测代码之外还有更多工作要做;您必须有效地收集运行时数据,并在执行过程之后生成调用图。因此,做这一切的工作相当多,但你可能从你的Glow体验中知道这一点。
答案 1 :(得分:1)
可能偏离主题,但您确定要实际调用图表吗?不知何故,我认为这样一个详细的图表在合理大小的应用程序中将毫无用处。我觉得更有用的是类之间的依赖图,只要你使用某种依赖注入就很容易获得。我使用谷歌guice(它实际上非常有用的重组/保持清洁一个合理大小的应用程序)。
有一个非常好的google-guice-dependency grapher,开箱即用,免费:http://code.google.com/p/google-guice/wiki/Grapher。我甚至自定义它(扩展Grapher类)来标记不同颜色的类类型(DAO,控制器,API等)...
答案 2 :(得分:0)
通过本机JVMTI C / C ++ native interfaces进行检测。就像我说的,我想留在纯Java。
Java确实有一个Runtime.getRuntime()。traceMethodCalls(),但你需要一些东西来消耗输出。