1. 程式人生 > >Btrace 基礎入門

Btrace 基礎入門

Btrace 有點像攔截器 和 Spring 的 AOP,只要是一個類的方法,Btrace 都可以進行攔截,下面來看看它一般都用在哪裡

攔截普通方法
@OnMethod(clazz="",method="")

@OnMethod(
			// 被攔截的 Java 類名
            clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",  
            // 攔截的方法名
            method="arg1",	
            // 入口處攔截
            
[email protected]
(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 指令碼檔案

[email protected]
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();
    }
[email protected] 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",
            [email protected](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",
            // 攔截方法裡的所有行
            [email protected](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 重啟。