相关文章:
Btrace (Byte Trace) 是 Sun 公司推出的一款 Java 动态、安全追踪 (监控) 工具,可以在不停机的情况下监控系统运行情况,并且做到最少的侵入,占用最少的系统资源,也就是说 Btrace 可以动态地向目标应用程序的字节码注入追踪代码
Btrace 脚本其实就是一个普通的 Java 类,只不过用 @Btrace 注解进行了修饰,一个 Btrace 脚本可以包含一个或多个拦截方法,需要注意的是,拦截方法必须用 public static void 进行修饰,否则启动 Btrace 脚本时会报错
此外,为了保证对目标程序不造成影响,Btrace 脚本对可执行动作做了诸多限制
-
不能创建对象
-
不能创建数组
-
不能抛出异常
-
不能捕捉异常
-
不能调用任何实例方法或静态方法,只能调用 BTraceUtils 工具类中的静态方法
-
不能分配给目标程序的类或对象的静态或实例字段,但可以分配给其自身的静态字段
-
不能有实例字段和方法
-
不能有外部类、内部类、嵌套类或本地类
-
不能有同步块或同步方法
-
不能有循环
-
不能扩展任意类 (父类必须是 Object)
-
不能实现接口
-
不能包含断言语句
-
不能使用类文字 (由一个类、接口、数组或原始类型的名称后面加上一个 “.class” 组成,如 String.class)
一、常用类注解
-
@Btrace
- 用于表明该类是一个 Btrace 脚本
二、常用方法注解
-
@OnMethod
-
用于指定方法中的目标类、目标方法和拦截位置
-
当目标方法到达指定位置时,调用被修饰的方法
-
参数说明
参数 含义 clazz 目标类 method 目标方法 type 目标方法签名,一般可以不声明,通常依靠 clazz 和 method 即可确定目标方法 location 拦截位置 -
拦截位置 (Location) 说明
参数 含义 Kind.ENTRY 在入口进行拦截 (默认) Kind.RETURN 在返回进行拦截 Kind.THROW 在抛出异常时进行拦截 Kind.LINE 在某一行进行拦截
-
-
@OnTimer
- 用于指定每隔多少毫秒进行一次跟踪操作
-
@OnError
-
用于当目标方法抛出异常或错误时进行跟踪操作
-
当同一 Btrace 类中其他任何 BTrace 操作方法抛出异常时也会进行跟踪操作
-
-
@OnExit
- 用于指定当 Btrace 代码调用 exit(int) 方法时进行跟踪操作
-
@Location
- 用于指定目标方法的拦截位置
三、常用参数注解
-
@Self
- 标记一个参数,用于保存 this
-
@Return
- 标记一个参数,用于保存返回值
-
@ProbeClassName
- 标记一个参数,用于保存目标类的类名
-
@ProbeMethodName
- 标记一个参数,用于保存目标方法的方法名
-
@Duration
- 标记一个参数,用于保存目标方法的持续时间
-
@TargetInstance
- 标记一个参数,用于保存目标方法内部调用的实例
-
@TargetMethodOrField
- 标记一个参数,用于保存目标方法内部调用的方法
四、常用字段注解
-
@TLS
- 标记一个字段,用于指定该字段为线程本地字段
五、其他注解
- 其他注解详见官方文档
六、注意事项
-
Btrace 脚本默认只能在本地运行
-
生产环境下可以使用 Btrace 脚本,但是被修改后的字节码不会被还原