我想要在命令行中创建Java项目的调用图。我探索了几个项目,每次都没有达到我的目标(无论是我的理解还是功能上)。能够提供一些简单的指导将会很棒,我的额外目标是获得这个图的文本表示。
以下是我尝试过的内容:
调用图:https://github.com/gousiosg/java-callgraph
这给了我想要的文本输出,但我找不到一种方法(在查看了文档一段时间后),将其转换为可视化(图像文件)输出。
Soot: http://sable.github.io/soot/
在花费大量时间浏览 SOOT 文档之后(似乎很难跟随),我设法让 SOOT 创建字节码。然而,我找不到任何关于如何从中创建调用图的指南。我只在主页上看到它可以做到这一点,并且通过我的谷歌搜索获得了几封电子邮件交流,其中所有问题都没有答案。我正在使用以下命令进行夜间构建:
java -cp soot-trunk.jar soot.Main -cp . -pp HelloWorld
在这里,HelloWorld是我的java文件的名称,我得到了一个输出,它是一个.class文件,但我不知道如何获取实际的调用图。这是在按照此处的指南后:https://github.com/Sable/soot/wiki/Running-Soot。当我查看有关可视化的链接时,它们似乎都是损坏的链接,然后将重定向回主页。我可以看到关于在命令行页面上使用-cg标志的一些信息,但无法使其工作 - 我只会得到选项解析错误,建议使用无效参数:https://ssebuild.cased.de/nightly/soot/doc/soot_options.htm#phase_5
搜索stackoverflow-现有答案 我已经查看了几个类似的问题,例如:Static analysis of Java call graph。然而,答案只是说“使用soot”或“使用调用图”,我已经尝试过这些方法,但没有任何运气 - 尽管我最接近文本输出的调用图。
我看到一些基于GUI的软件和eclipse插件声称可以创建调用图,但我正在尝试从命令行中使其工作。
非常感谢任何帮助,一个指南或一组使用调用图、Soot或另一个程序的命令将非常有帮助。也许值得将任何短教程提交回给他们以供文档使用,因为在搜索时似乎有更多的问题而不是答案。
供参考,我当前正在尝试使用下面的非常简单的类:
public class HelloWorld {
public static void main(String[] args) {
foo();
}
public static void foo(){
System.out.println("Hello World");
}
}