美文网首页
关于BTrace定位问题

关于BTrace定位问题

作者: 一个神奇的女码农 | 来源:发表于2018-12-07 16:39 被阅读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();

        }

    ```

    相关文章

      网友评论

          本文标题:关于BTrace定位问题

          本文链接:https://www.haomeiwen.com/subject/tctxhqtx.html