Btrace 基础入门

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=" <init> ")

@OnMethod(
            clazz="com.lucasma.monitor.monitor_tuning.chapter2.User",
            method="<init>"
    )
    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,<init>
[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 注意点

  • 默认只能本地
  • 可以在生产环境使用,但是被Btrace 修改后的 ,但是被修改的字节码,在Btrace 进程退出之后,是不会被还原的,除非 JVM 重启。

猜你喜欢

转载自blog.csdn.net/Andy86869/article/details/83243725