http://www.jianshu.com/p/26f19095d396

背景

生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信息,如方法参数、返回值来定位问题,通过传统的增加日志记录的方式非常繁琐,而且需要重启server,代价很大。BTrace应运而生,可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计。

配置及用法

  1. 去官网下载BTrace,配置环境变量以便在任何路径下能执行btrace命令。

  2. 命令格式:

    btrace [-p <port>] [-cp <classpath>] <pid> <btrace-script>

port指定BTrace agent的服务端监听端口号,用来监听clients,默认为2020,可选。
classpath用来指定类加载路径,比如你的BTrace代码里用到了netty等第三方jar包。
pid表示进程号,可通过jps命令获取。
btrace-script即为BTrace脚本。
下面是我用来测试的一条btrace命令,大家可以参考一下:

btrace -p 2020 -cp
/home/mountain/Softwores/tomcat8/lib/servlet-api.jar (jps | grep
Bootstrap | awk '{print $1}') /home/mountain/test/Btrace.java

实战

  1. 获取方法参数以及返回值

    业务代码:

    public String sayHello(String name, int age) {
    return "hello everyone";
    }

    BTrace代码:

    import com.sun.btrace.BTraceUtils;
    import static com.sun.btrace.BTraceUtils.*;
    import com.sun.btrace.annotations.*; @BTrace
    public class Btrace { @OnMethod(
    clazz = "com.jiuyan.message.controller.AdminController",
    method = "sayHello",
    location = @Location(Kind.RETURN)//函数返回的时候执行,如果不填,则在函数开始的时候执行
    )
    public static void sayHello(String name, int age, @Return String result) {
    println("name: " + name);
    println("age: " + age);
    println(result);
    } }

    调用sayHello('mountain', 1),输出应该是:

    name: mountain
    age: 1
    hello everyone

    可以对字符串进行正则匹配以达到监控特定问题的目的:

    if(BTraceUtils.matches(".*345.*", str)) {
    println(str);
    }
  2. 计算方法运行消耗的时间

    BTrace代码:

    import java.util.Date;
    
    import com.sun.btrace.BTraceUtils;
    import static com.sun.btrace.BTraceUtils.*;
    import com.sun.btrace.annotations.*; @BTrace
    public class Btrace { @OnMethod(
    clazz = "com.jiuyan.message.controller.AdminController",
    method = "sayHello",
    location = @Location(Kind.RETURN)
    )
    public static void sayHello(@Duration long duration) {//单位是纳秒,要转为毫秒
    println(strcat("duration(ms): ", str(duration / 1000000)));
    } }

最新文章

  1. [BOT] 一种android中实现“圆角矩形”的方法
  2. SQL Server常用的性能诊断语句
  3. Tomcat并发数优化,修改service.xml性能调优 增加最大并发连接数
  4. 安卓开发 想要获取某个View的高度(我是在做滚动浮层的时候用到的)
  5. 呆呆的io流输入输出的一些基础
  6. 双栈排序 noip2008
  7. Android 在Intent中传递接口
  8. 盘点 PHP 和 ASP.NET 的10大对比!
  9. 【BZOJ3673】【可持久化并查集】可持久化并查集 by zky
  10. python3数据结构
  11. Message Queuing(MSMQ)
  12. 《Java》第三周学习总结 20175301
  13. Hbase数据表解析
  14. java 网络编程(五)Socket多线程上传文件
  15. Go语言实现数据结构(一)单链表
  16. js 判断移动端是否安装应用
  17. leetcode350
  18. String StringBuilder StringBuffer 对比 总结得非常好
  19. PL/SQL之存储过程和函数
  20. 对SSL一个疑问的新理解

热门文章

  1. iOS开发SDWebImage源码解析之SDWebImageManager的注解
  2. C# .net 调用QQ邮箱
  3. 基于3D卷积神经网络的人体行为理解(论文笔记)(转)
  4. LoadRunner数据库监控指标
  5. 【C/C++语法外功】类的静态成员理解
  6. Android基础------Intent组件
  7. Delphi实现在数据库中存取图像
  8. Delphi DBGrid双击事件、单元格操作
  9. Sparse autoencoder implementation 稀疏自编码器实现
  10. Properties 的list方法 直接将内容放到文本中