首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用soot分析.class文件?

如何使用soot分析.class文件?
EN

Stack Overflow用户
提问于 2020-05-30 05:26:57
回答 1查看 350关注 0票数 0

我正在尝试为spotbugs-4.0.2构建一个带有烟灰的调用图(CG)。代码如下所示。

代码语言:javascript
复制
public static void main(String[] args) {

    String analyzed_classes_dir = "C:\\Users\\lyu\\lll\\src\\test\\java\\com\\demo\\dir3\\spotbugs"; //contains all structured class files
    String mainclass = "edu.umd.cs.findbugs.LaunchAppropriateUI";

    //set classpath
    String javapath = System.getProperty("java.class.path");
    String jredir = System.getProperty("java.home") + "\\lib\\rt.jar";
    String libs = "C:\\Users\\liuyu\\lll\\src\\test\\java\\com\\demo\\libs\\spotbugs-4.0.2\\";
    String path = javapath + File.pathSeparator + jredir + File.pathSeparator + libs;

    Scene.v().setSootClassPath(path);

    //add an intra-procedural analysis phase to Soot
    TestCallGraphSootJar_3 analysis = new TestCallGraphSootJar_3();
    PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph", analysis));

    excludeJDKLibrary();

    Options.v().set_process_dir(Arrays.asList(analyzed_classes_dir));
    Options.v().set_whole_program(true);
    Options.v().set_no_bodies_for_excluded(true);
    Options.v().set_allow_phantom_refs(true);

    Scene.v().loadNecessaryClasses();
    SootClass appclass = Scene.v().getSootClass(mainclass);
    Scene.v().setMainClass(appclass); // exception here.

    enableSparkCallGraph();

    PackManager.v().runPacks();
}

然后是一个例外:

代码语言:javascript
复制
Exception in thread "main" java.lang.RuntimeException: Main-class has no main method!
at soot.Scene.setMainClass(Scene.java:187)
at com.ouc.TestCallGraphSootJar_3.main(TestCallGraphSootJar_3.java:65)

语句"Scene.v().setMainClass(appclass);“抛出上述异常。我进行了调试,发现appclass中的methodlst为空。而appclass是个幽灵。如图所示。fig. the debug information of appclass

mainclass确实存在于指定的路径中,并且它包含main方法。

我在GitHub (https://github.com/Sable/soot/issues/1346#issuecomment-627551137)中提交了一个问题,但没有解决它。而options manual也没有帮助解决这个问题。

顺便说一句,我可以只分析给定类中的调用关系吗?例如,我只想获取类C1内部的调用信息。

代码语言:javascript
复制
Class C1{
  main(){
    m1(parm);
  }

  m1(args){
    m2(xxx);
  }

  m2(args){
    m3(xxx);
  }

  m3(args){
    ...  
  }
}

然后我只想获得下面的调用关系:

代码语言:javascript
复制
main——>m1()——>m2()——m3()

如果main或m1或m2或m3调用另一个类C2中的方法,我将忽略它,只关注C1中的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-31 06:49:50

我是发问者,我已经解决了这个问题。如果你对这个问题感兴趣,你可以在本期post中阅读它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62094822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档