2

特定のクラスのすべての関数の実行時間を測定するためにすすを使用しようとしています。Eric Bodden による Soot Framework のすべてのチュートリアルを読もうとしました。

私が今までに思いついたのはこれです、

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 で add variable を使用し、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()>

これで、Soot がバイトコードを読み取り、すべてのメソッドをステップ実行していることがわかります。私がやりたいことは、それぞれを実行することです。これはすすフレームワークを使用して可能ですか??

4

1 に答える 1

2

おそらくこれが、人々が煤を使いたがる理由ではないでしょう。すすを使用してそれを行うエレガントな方法があるかどうかはわかりません。しかし、間違いなく、ここでリフレクションの力を利用できます。internalTransform()メソッドの最後に次の行を追加すると機能するはずです。

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

もちろん、クラスTestClass内にはinit()メソッドのようなものはありません。したがって、そのメソッドを呼び出したくありません。また、main()メソッドについては、リフレクションの構文に従って正しいパラメーターを指定する必要があります。それ以外の場合は、例外があります。

それが役立つことを願っています。ありがとう。

于 2013-03-03T09:29:47.063 に答える