关于BTrace定位问题

2018-12-07  本文已影响0人  一个神奇的女码农

如何定位:

昨天的案例中使用的是精准定位,即clazz = 类的路径

例:

```

@OnMethod(

            clazz="com.rt.BtraceTest", method="add", location=@Location(Kind.RETURN)

)

```

这样子写的话,每个类都要写个脚本,到生产环境上是个大工程啊!

于是就有了plan B,正则表达式定位

正则表达式在两个"/"之间,中间的.用//转译

例:

```

@OnMethod(

            clazz="/com\\.rt\\..*/", method="/.*/", location=@Location(Kind.RETURN)

)

```

但是这个方法的会,如果范围太大,就会影响性能,所以正式环境中,范围要尽可能的小一点.

小一点有不够全怎么办呢!

于是plan C正式上场了,按接口或继承类定位

写一个base的接口或者基类,在类的前面加上”+”就可以了

例:

```

@OnMethod(

            clazz="+com.rt.BaseBtrace", method="/.*/", location=@Location(Kind.RETURN)

)

```

这样就想要定位谁就自己继承或实现一下,是不是完美

够用了吧,其实还有一个注解定位.

查了很多资料,试了很久都没成功,决定放弃

希望有成功的大佬能指导我一下.

附上几个测试小demo

//最简单的参数输出

```

@OnMethod(

            clazz="com.rt.BtraceTest", method="add", location=@Location(Kind.RETURN)

    )

    public static void func(int a, int b, @Return int result) {

        println("trace: =======================");

        jstack();

        println(strcat("a:", str(a)));

        println(strcat("b:", str(b)));

    }

```

//调用了几次

```

@Export static AtomicLong counter = new AtomicLong();

@OnMethod(

            clazz="com.rt.BtraceTest", method="add", location=@Location(Kind.RETURN)

    )

    public static void run() {

        counter.getAndIncrement();

    }

    @OnTimer(1000 * 30)

    public static void run(){

        BtraceUtils.println("count:" + counter.get());

        counter.set(0);

        }

//调用gc

@OnMethod(clazz = "java.lang.System", method = "gc")

    public static void onSystemGC() {

        println("entered System.gc()");

        jstack();

    }

```

上一篇 下一篇

猜你喜欢

热点阅读