BTrace

BTrace

背景:程序出问题,线上机器 DEBUG 端口没有开,那段代码没有打印日志,重启会破坏现场,Review 又看不出来代码哪里有问题。

java.lang.instrument.Instrumentation

Instrumentation 可以让我们动态替换字节码:

  • redifineClasses: 重新定义 class,自己提供字节码文件替换掉已经存在的 class 文件
  • retransformClasses: 修改 class,在已经存在的字节码文件上修改后再替换之

BTrace 架构

  • BTrace 脚本:利用 BTrace 提供的注解,方便我们开发脚本。
  • Compiler:将 BTrace 脚本编译成 BTrace class 文件。
  • Client:将 class 文件发送到 Agent。
  • Agent:基于 Java 的 Attach Api,Agent 可以动态附着到一个运行的 JVM 上,然后开启一个 BTrace Server,接受 client 发过来的 BTrace 脚本;解析脚本,然后根据规则找到修改的类,修改字节码后,调用 Java 的 InstrumentreTransform 接口,完成对对象行为的修改并使之生效。

BTrace 工作流程如下:

BTrace 借助 Instruments 实现 class 的替换。Instruments 存在诸多限制,BTrace 也不例外:

  • 不允许创建对象
  • 不允许创建数组
  • 不允许抛异常
  • 不允许 catch 异常
  • 不允许随意调用其他对象或者类的方法,只允许调用 com.sun.btrace.BTraceUtils 中的一些静态方法
  • 不允许改变类的属性
  • 不允许有成员变量和方法,只允许存在 static public void 方法
  • 不允许有内部类、嵌套类
  • 不允许有同步方法和同步块
  • 不允许有循环
  • 不允许随意继承其他类
  • 不允许实现接口
  • 不允许使用 assert
  • 不允许使用 Class 对象

Arthas

阿里巴巴的 Arthas 提供简单的命令行工具,更为方便。