引子
最近看了美团的一篇文章Java动态追踪技术探究,产生了一种强烈的共鸣,卧槽,这也太炫酷了吧。好吧,各位看官请放下手中的屠刀,原谅我这个菜鸡。
简介
看到这里的,应该原谅我这个小菜鸡了,既然如此就来说说这个BTrace。
BTrace github地址
BTrace是Java的安全可靠的动态跟踪工具。 它的工作原理是通过 ASM、Java Attach Api、Instruments 来对正在运行的java程序中的class类进行动态增强。也就是说btrace可以在Java程序运行时,动态地向目标应用程序的字节码注入追踪代码。这样,当某个程序出现bug,无需线上重启服务器也可以追踪bug,这里说的不能重启一是线上服务器不能重启,二是重新编译部署后bug也很有可能无法重现。
说他是安全可靠的,是因为它对正在运行的程序是只读的。也就是说,他可以插入跟踪语句来检测和分析运行中的程序,不允许对其进行修改。因此他存在一些限制:
- 不能创建对象
- 不能创建数组
- 不能抛出和捕获异常
- 不能调用任何对象方法和静态方法
- 不能给目标程序中的类静态属性和对象的属性进行赋值
- 不能有外部、内部和嵌套类
- 不能有同步块和同步方法
- 不能有循环(for, while, do…while)
- 不能继承任何的类
- 不能实现接口
- 不能包含assert断言语句
这些限制其实是可以使用unsafe模式绕过。通过在BTrace脚本中声明 @BTrace(unsafe = true) 注解 ,并且使用 -u 选项,指定以 unsafe 模式运行btrace即可
注:实际使用非安全模式跟踪时,发现一个问题,一个进程如果被安全模式btrace探测过一次, 后面再使用非安全模式进行探测时非安全模式不生效。
那么BTrace的架构是怎样的?
BTrace主要有下面几个模块:
- BTrace脚本:利用BTrace定义的注解,我们可以很方便地根据需要进行脚本的开发。
- Compiler:将BTrace脚本编译成BTrace class文件。
- Client:将class文件发送到Agent。
- Agent:基于Java的Attach Api,Agent可以动态附着到一个运行的JVM上,然后开启一个BTrace Server,接收client发过来的BTrace脚本;解析脚本,然后根据脚本中的规则找到要修改的类;修改字节码后,调用Java Instrument的reTransform接口,完成对对象行为的修改并使之生效。
安装
安装过程在这里不做介绍了,一般下载好之后,配置下环境变量就可以了。
使用
1. 创建待监控的程序