Btrace 有点像拦截器 和 Spring 的 AOP,只要是一个类的方法,Btrace 都可以进行拦截,下面来看看它一般都用在哪里
拦截普通方法
@OnMethod(clazz="",method="")
@OnMethod(
// 被拦截的 Java 类名
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
// 拦截的方法名
method="arg1",
// 入口处拦截
location=@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
btrace 进程ID 脚本文件
lucasma@LucasdeMacBook-Pro chapter4 $ btrace 45824 PrintArgSimple.java
[lucas ma, ]
com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller,arg1
拦截构造函数
@OnMethod(clazz="",method="
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter2.User",
method=""
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.printArray(args);
BTraceUtils.println();
}
lucasma@LucasdeMacBook-Pro chapter4 $ btrace 45919 PrintConstructor.java
com.lucasma.monitor.monitor_tuning.chapter2.User,
[12, lucas, ]
拦截同名函数 用参数区分
@BTrace
public class PrintSame {
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
method="same"
)
//通过方法的参数来判断拦截哪个,这里只有 Sting类型的 name,所以只能拦截同名函数 same 中只有一个参数的 name的哪个 same 函数
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, String name) {
BTraceUtils.println(pcn+","+pmn + "," + name);
BTraceUtils.println();
}
}
拦截时机
Kind.ENTRY // 入口 ,默认值
Kind.RETURN // 返回
kind.THROW // 异常
Kind.LINE // 行
返回地拦截
@BTrace
public class PrintArgSimple {
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
method="arg1",
location=@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
拦截行判断
@BTrace
public class PrintLine {
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
method="exception",
// 拦截方法里的所有行
location=@Location(value=Kind.LINE, line=-1)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, int line) {
BTraceUtils.println(pcn+","+pmn + "," +line);
BTraceUtils.println();
}
}
通过正则表达式的方式拦截
@BTrace
public class PrintRegex {
@OnMethod(
// 这个类名支持正则表达式
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
// 拦截这个类的所有方法
method="/.*/"
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn) {
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
使用 Btrace 注意点