一、简介
BTrace可以动态地向目标应用程序的字节码注入追踪代码
使用技术:JavaComplierApi、JVMTI、Agent、Instrumentation+ASM
二、下载和使用
下载页面:https://github.com/btraceio/btrace/releases/tag/v1.3.11.3
下载后进行环境变量的配置,配置具体可参考其他博客
把文件夹build里面的jar包添加到项目中就可以写brace脚本了
脚本格式
@BTrace
public class PrintArgSimple {
@OnMethod(
clazz="",
method="",
location=@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
}
}
1、类名加上注解@BTrace声明这是一个btrace脚本
2、方法名上加上@OnMethod配置拦截厄类(clazz)、方法(method)、拦截时机(location)
3、方法入参@ProbeClassName声明参数为class名称、 @ProbeMethodName为方法名称、args为拦截方法的参数
三、拦截方法
普通方法
@OnMethod(clazz="",method="")
构造函数
@OnMethod(clazz="",method="<init>")
拦截同名用参数区分
四、拦截时机
Kind.ENTRY:入口(默认)
Kind.RETURN:返回
Kind.THROW:异常
Kind.LINE:行
五、拦截this、入参、返回
this:@Self
入参:可以用AnyType、也可以用真实类型、同名的用真实的
返回:@Return
六、获取对象的值
简单类型:直接获取
BTraceUtils.printFields(user);
复杂类型:反射,类名+属性名
Field filed2 = BTraceUtils.field("", "");
七、注意事项
- 默认只能在本地运行,如果需要远程运行则需要修改源代码
- 生产环境下可以使用,但是被修改的字节码不会被还原