как использовать статический метод btrace probe?

мне нужно исследовать статический метод. но вызов метода не может быть проверен. кто-нибудь может предложить некоторую помощь?

мой Java-код: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// CaseObject.java
package test;

public class CaseObject{

    private static int sleepTotalTime=0;

    public boolean execute(int sleepTime) throws Exception{
        System.out.println("sleep: "+sleepTime);
        sleepTotalTime+=sleepTime;
        Thread.sleep(sleepTime);
        return true;
    }

    public static boolean execute2(int sleepTime) throws Exception{
        System.out.println("sleep: "+sleepTime);
        sleepTotalTime+=sleepTime;
        Thread.sleep(sleepTime);
        return true;
    }
}

// Case2.java
package test;

import java.util.Random;

public class Case2 {

    public static void main(String[] args) throws Exception {
        Random random = new Random();
        boolean result = true;
        while (result) {
            result = CaseObject.execute2(random.nextInt(1000));
            Thread.sleep(1000);
        }
    }

}

мой скрипт btrace ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// TraceMethodArgsAndReturn2.java
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace public class TraceMethodArgsAndReturn2{
    @OnMethod(
            clazz="test.CaseObject",
            method="execute2",
            location=@Location(Kind.RETURN)
    )
    public static void traceExecute(@Self test.CaseObject instance,int sleepTime,@Return boolean result){
        println("call CaseObject.execute2");
        println(strcat("sleepTime is:",str(sleepTime)));
        println(strcat("sleepTotalTime is:",str(get(field("test.CaseObject","sleepTotalTime"),instance))));
        println(strcat("return value is:",str(result)));
    }
}

и я запускаю это так ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./btrace/bin/btrace -cp /tmp/a/ цель/классы/ 8477 ./btrace/TraceMethodArgsAndReturn2.java


person Brian HU    schedule 23.07.2014    source источник


Ответы (2)


хорошо, я нашел проблему... @Self не следует использовать.

person Brian HU    schedule 23.07.2014
comment
Этот ответ может использовать больше объяснений. - person Dave Cousineau; 23.07.2014
comment
хм, извините за это ... я только что удалил экземпляр @Self test.CaseObject и получил то, что хочу. - person Brian HU; 23.07.2014
comment
Действительно, использование @Self заставит зонд сопоставлять только нестатические методы. И можно проверить вызов метода, используя location=@Location(Kind.CALL) - person JB-; 23.07.2014
comment
@ J.B Мне почти не повезло с запуском каких-либо примеров на Java 8, Windows 7 или Mac OSX 10. Есть ли какая-либо документация, объясняющая все тонкости, или нам нужно просто работать над примерами? - person Victor Grazi; 09.09.2015

В общем, вы можете исследовать статические методы следующим образом:

@OnMethod(clazz = "java.lang.Integer", method = "valueOf")
public static void onValueOf(int name) {
  println("***********************");
  jstack();
}
person Dan    schedule 13.09.2016