1. 方法被调用时打印调用堆栈
@OnMethod(clazz = "com.test.test.btrace.AppObj", method = "execute")
public static void traceExecute() {
println("call AppObj called");
jstack();
}
2. 打印这个类哪些行被调用
@OnMethod(clazz = "com.test.test.btrace.AppObj", location = @Location(value = Kind.LINE, line = -1))
public static void line(@ProbeClassName String pcn, @ProbeMethodName String pmn, int line) {
print(Strings.strcat(pcn, "."));
println(Strings.strcat(pmn, ":"));
println(line);
}
3. 打印方法花费时间
@TLS
static long beginTime1;
@OnMethod(clazz = "com.test.test.btrace.AppObj", method = "execute")
public static void traceBegin1() {
beginTime1 = timeMillis();
}
@OnMethod(clazz = "com.test.test.btrace.AppObj", method = "execute", location = @Location(Kind.RETURN))
public static void traceExecute1() {
println(strcat("time:", str(timeMillis() - beginTime1)));
}
4. 打印方法参数
@OnMethod(clazz = "com.test.test.btrace.AppObj", method = "execute")
public static void traceExecute2(@Self Object instance, AnyType[] args) {
printArray(args);
}
5. 打印返回值
@OnMethod(clazz = "com.test.test.btrace.AppObj", method = "execute", location = @Location(Kind.RETURN))
public static void traceExecute(@Self Object instance, @Return boolean result) {
println("call AppObj called");
println(strcat("result=", str(result)));
}
6. 打印对象属性值
@OnMethod(clazz = "com.test.test.btrace.AppObj", method = "execute")
public static void traceExecute(@Self AppObj self) {
println(get(field("com.test.test.btrace.AppObj", "sum"), self));
}