版权声明:技术专栏,转载请注明! 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)));
}
}