BTrace的使用

2019-05-06  本文已影响0人  谁说咖啡不苦

简介

BTrace安装

新建环境变量: BTRACE_HOME, 下载Release来使用。

简单的使用

package com.songshuang.btrace;

import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.AnyType;

@BTrace
public class PrintArgSimple{

    @OnMethod(
        clazz="com.songshuang.sentinel.monitor.chapter2.BtraceController",
        method="arg",
        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 PrintSame {
   
   @OnMethod(
       clazz = "com.xxx.xxx",
       method= "methodName"
   )
   public static void anyRead(@ProbeClassName String pcn, @ProbeMehtodName String pmn, String name, int id) {
       BTraceUtils.println(pcn + "," + pmn + "," + name + "," + id);
       BTraceUtils.println();
   }
   
    @OnMethod(
       clazz = "com.xxx.xxx",
       method= "methodName"
   )
   public static void anyRead(@ProbeClassName String pcn, @ProbeMehtodName String pmn, String name) {
       BTraceUtils.println(pcn + "," + pmn + "," + name + "," + id);
       BTraceUtils.println();
   }
}

拦截两个相同名字的函数,不同参数的方法,一个方法传递一个String和Int两个参数,一个方法只传递String的参数。


拦截时机


拦截返回:

@BTrace
public class PrintArgSimple{

    @OnMethod(
        clazz="com.songshuang.sentinel.monitor.chapter2.BtraceController",
        method="arg",
        location=@Location(Kind.RETURN)
    )
    public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, @Return AnyType return) {
        BTraceUtils.printArray(args);
        BTraceUtils.println(pcn + ", " + pmn);
        BTraceUtils.println();
    }
}

@Return表示就是获取返回的数据


拦截异常: 具体可以参考官方demo

@BTrace
public class PrintArgSimple{
    // store current exception in a thread local
    // variable(@TLS annotation). Note that we can't
    // store it in a global variable!
    @TLS
    static Throwable currentException;
    
    @OnMethod(
        clazz="java.lang.Throwable",
        method="<init>"
    )
    public static void onThrow(@Self Throwable self, Throwable cause) {
        currentException = self;
    }

    @OnMethod(
clazz="com.songshuang.sentinel.monitor.chapter2.BtraceController",
        method="arg",
        location=@Location(Kind.THROW)
    )
    public static void anyException() {
        if (currentException != null) {
            BTraceUtils.Threads.jstack(currentException);
            currentException = null;
        }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读