Btrace 使用

版权声明:技术专栏,转载请注明! https://blog.csdn.net/wankunde/article/details/81084560

Btrace脚本说明

btrace 使用

bin/btrace -cp build/ -p 2021 18822 ~/TracingScript.java
-cp 修改classpath
-p 指定端口,默认为2020
[pid]
[*.java] Btrace脚本

方法参数
@Duration long duration // 方法执行时间,单位:纳秒
jstack(); // 查看堆栈

指定方法拦截的位置:@Location

定义Btrace对方法的拦截位置,通过@Location注解指定,默认为Kind.ENTRY

Kind.ENTRY:在进入方法时,调用Btrace脚本
Kind.RETURN:方法执行完时,调用Btrace脚本,只有把拦截位置定义为Kind.RETURN,才能获取方法的返回结果@Return和执行时间@Duration
Kind.CALL:分析方法中调用其它方法的执行情况,比如在execute方法中,想获取add方法的执行耗时,必须把where设置成Where.AFTER
Kind.LINE:通过设置line,可以监控代码是否执行到指定的位置
Kind.ERROR, Kind.THROW, Kind.CATCH

  • 监控代码是否到某一行


clazz = "java.net.ServerSocket",
location = @Location(value = Kind.LINE, line = 363)

使用实例

1

/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.AnyType;

@BTrace
public class TracingScript {
    /* put your code here */
    @OnMethod(
        clazz="org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSParentQueue",
        method="assignContainer",
        location=@Location(Kind.RETURN)
    )
    public static void testAssignContainer(
            @Self Object self,
            AnyType[] args,
            @Return AnyType res) {
        printArray(args);
        Object childQueues = get(field("org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSParentQueue", "childQueues"), self);
        println(strcat("childQueues:", str(childQueues)));
        println(strcat("result:", str(res)));
    }
}

猜你喜欢

转载自blog.csdn.net/wankunde/article/details/81084560