2013-03-02 66 views
1

我正在嘗試使用soot來測量特定類中每個函數的執行時間。我曾試着閱讀Eric Bodden的Soot Framework的所有教程。使用Soot運行函數

我已經想出到目前爲止是這樣的,

package test; 

import java.util.Map; 

import soot.Body; 
import soot.BodyTransformer; 
import soot.PackManager; 
import soot.Scene; 
import soot.SootClass; 
import soot.SootMethod; 
import soot.Transform; 

public class MyMain { 
    public static void main(String[] args) { 

     PackManager 
       .v() 
       .getPack("jtp") 
       .add(new Transform("jtp.GotoInstrumenter", GotoInstrumenter.v())); 

     System.out.println(Scene.v().defaultClassPath()); 
     SootClass sootClass = Scene.v().loadClassAndSupport("test.TestClass"); 


     if (sootClass == null || !(sootClass instanceof SootClass)) { 
      System.out.println("sootClass not initialized"); 
      System.exit(0); 
     } else { 
      System.out.println(sootClass.getMethodCount()); 
     } 
     sootClass.setApplicationClass(); 
     for (SootMethod m : sootClass.getMethods()) { 

      try { 
       new Transform("jtp.GotoInstrumenter", GotoInstrumenter.v()) 
         .apply(m.retrieveActiveBody()); 
      } catch (Exception e) { 
       System.out.println("Exeception in for loop : " + e); 
      } 
     } 

    } 

} 

@SuppressWarnings("all") 
class GotoInstrumenter extends BodyTransformer { 
    private static GotoInstrumenter instance = new GotoInstrumenter(); 

    private GotoInstrumenter() { 
    } 

    public static GotoInstrumenter v() { 
     return instance; 
    } 

    protected void internalTransform(Body body, String phaseName, Map options) { 

     System.out.println("Processing method : " 
       + body.getMethod().getSignature()); 
    } 
} 

這裏是我的TestClass

package test; 

public class TestClass { 
    public static void main(String[] args) { 
     System.out.println("I am in test class"); 
    } 
    public void f1(){ 
     System.out.println(Math.pow(2, 10)); 
    } 
} 

我已經用在Eclipse中添加變量,就像一個Java應用程序執行它添加sootclasses 。

這是我的程序輸出:

C:\Users\Aks\Java\soot-2.5.0.jar;C:\Users\Aks\workspace\SootAnalysis\bin;D:\Installs\eclipse\plugins\ca.mcgill.sable.soot.lib_2.5.2\lib\sootclasses.jar;;C:\Program Files\Java\jre7\lib\rt.jar 
3 
Processing method : <test.TestClass: void <init>()> 
Processing method : <test.TestClass: void main(java.lang.String[])> 
Processing method : <test.TestClass: void f1()> 

現在我明白了煙塵已經閱讀字節碼,並通過所有方法步進。我想要做的是,運行它們中的每一個。這可能使用菸灰框架?

回答

2

可能這不是人們想要使用菸灰的原因。我不知道是否有任何優雅的方式來使用菸灰。但是,當然,你可以在這裏利用反思的力量。添加在internalTransform結束以下行()方法應該工作:

TestClass.class.getMethod(body.getMethod().getName()).invoke(new TestClass());

當然,有沒有像類的TestClass的init()方法。所以,你不想調用這個方法。另外,對於main()方法,您需要根據反射語法指定正確的參數。否則,會有例外。

希望它會有所幫助。謝謝。

+1

這是真的沒有菸灰支持(甚至應該支持)。因此使用Reflection或僅使用shell腳本似乎是合適的。 – Eric 2013-03-03 10:58:25

+0

謝謝Eric和Mainul。很久以後我才意識到Soot只做靜態分析。對不起這是我的錯 – 2013-03-03 15:02:06