Btrace

作者: 八颗小牙坏脾气 | 来源:发表于2018-12-23 20:27 被阅读0次

入门

拦截方法

* 普通方法 @OnMethod(clazz="", method="")
* 构造函数 @OnMethod(clazz="", method="<init>")
* 拦截同名函数,用参数区分

拦截时机

* Kind.ENTRY: 入口,默认值
* Kind.RETURN: 返回
* Kind.THROW: 异常
* Kind.Line: 行

拦截this,参数,返回值

* this: @Self
* 入参: 可以用AnyType,也可以用真实类型,同名的用真实的
* 返回: @Return

获取对象的值

* 简单类型: 直接获取
* 复杂类型: 反射,类名+属性名

其他

* 打印行号: Kind.LINE
* 打印堆栈: Threads.jstack()
* 打印环境变量
/**
 * @author zhoucong04
 * @date 2018/12/23.
 */
@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping("/v1")
    @ResponseBody
    public String index(@RequestParam("name") String username) {
        return "hello," + username;
    }

    @GetMapping("/user")
    @ResponseBody
    public User get(User user) {
        return user;
    }

    @GetMapping("/hi1")
    @ResponseBody
    public String welcome(@RequestParam("name") String name, @RequestParam("id") int id) {
        return name + "," + id;
    }

    @GetMapping("/hi2")
    @ResponseBody
    public String welcome(@RequestParam("name") String name) {
        return name;
    }

    @GetMapping("/exception")
    @ResponseBody
    public String save() {
        try {
            System.out.println("start....");
            System.out.println(1 / 0);
            System.out.println("end....");
        } catch (Exception e) {
        }
        return "success";
    }
}
@BTrace
public class Arg {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "index",
            location = @Location(Kind.ENTRY)
    )
    public static void anyRead(@ProbeClassName String className, @ProbeMethodName String methodName, AnyType[] args) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.printArray(args);
    }
}
@BTrace
public class Constructor {

    @OnMethod(
            clazz = "com.le.model.User",
            method = "<init>",
            location = @Location(Kind.ENTRY)
    )
    public static void construct(@ProbeClassName String className, @ProbeMethodName String methodName, AnyType[] args) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.printArray(args);
    }
}
@BTrace
public class Same {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "welcome",
            location = @Location(Kind.ENTRY)
    )
    public static void hihihihi(@ProbeClassName String className, @ProbeMethodName String methodName, String name, int id) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.println(name + " ~ " + id);
    }
}
@BTrace
public class Return {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "index",
            location = @Location(Kind.RETURN)
    )
    public static void hi(@ProbeClassName String className, @ProbeMethodName String methodName, @com.sun.btrace.annotations.Return AnyType arg) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.println(arg);

    }
}
@BTrace
public class Line {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "save",
            location = @Location(value = Kind.LINE, line = 42)
    )
    public static void printLine(@ProbeClassName String className, @ProbeMethodName String methodName, int line) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.println(line);
    }
}
@BTrace
public class OnThrow {

    @TLS
    static Throwable currentException;

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow(@Self Throwable self) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow1(@Self Throwable self, String s) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow1(@Self Throwable self, String s, Throwable cause) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow2(@Self Throwable self, Throwable cause) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>",
            location = @Location(Kind.RETURN)
    )
    public static void onthrowreturn() {
        if (currentException != null) {
            BTraceUtils.Threads.jstack(currentException);
            BTraceUtils.println("=====================");
            currentException = null;
        }
    }
}
@BTrace
public class ArgComplex {

    @OnMethod(
            clazz = "com.zc.controller.HelloController",
            method = "get",
            location = @Location(Kind.ENTRY)
    )
    public static void anyRead(@ProbeClassName String className, @ProbeMethodName String methodName, User user) {
        BTraceUtils.printFields(user);
        Field name = BTraceUtils.field("com.le.model.User", "name");
        BTraceUtils.println(BTraceUtils.get(name, user));
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
    }
}
@BTrace
public class JInfo {
    static {
        BTraceUtils.println("System.Properties:");
        BTraceUtils.printProperties();
        BTraceUtils.println("VM Flags:");
        BTraceUtils.printVmArguments();
        BTraceUtils.println("OS Enviroment:");
        BTraceUtils.printEnv();
        BTraceUtils.exit(0);
    }
}

参考

https://github.com/btraceio/btrace/tree/master/samples
http://calvin1978.blogcn.com/articles/btrace1.html
https://www.jianshu.com/p/cff037edb750
https://blog.csdn.net/ZYC88888/article/details/81662671
http://blog.51cto.com/zero01/2143096
http://www.cnblogs.com/laoxia/p/9773319.html

相关文章

  • Btrace学习笔记二

    Btrace拦截行号 被拦截对象(Btrace只能在本地运行) 拦截行号的btrace脚本 运行btrace脚本 ...

  • Btrace UserGuide翻译转载

    原文地址:BTrace用户手册<译> BTrace(https://btrace.dev.java.net/) 是...

  • BTrace:线上问题排查工具

    BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程...

  • btrace-doc

    btrace on github demo 动态获取传入参数 源码 btrace脚本(PrintArgSimple...

  • 使用Btrace进行代码调试

    Btrace简介 Btrace是SUN公司开发的一款动态的Trace工具.Btrace最大的好处是可以自己编写脚本...

  • BTrace:Java 线上问题排查神器

    BTrace 是什么 BTrace 是检查和解决线上的问题的杀器,BTrace 可以通过编写脚本的方式,获取程序执...

  • 用btrace分析线上服务

    部署 btrace1.2.5.1已经部署到集群/home/xjyin/btrace-1.2.5.1 使用方式 基本...

  • btrace

    BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息。而不需要不断地修改代码,加入System...

  • Btrace

    入门 拦截方法 拦截时机 拦截this,参数,返回值 获取对象的值 其他 参考 https://github.co...

  • Btrace

    在之前介绍Java Agent的这篇文章中,简单介绍了Java agent的应用,里面提到了基于Java agen...

网友评论

      本文标题:Btrace

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