Btrace
你曾经是否碰到过排查问题的过程中,因为苦于log日志打印的不详细而导致排查不下去
比如:
1、想知道某个方法的调用参数和返回结果?
2、想知道某个接口方法调用的耗时或者该方法内调用的多个子方法的耗时?
3、某个方法抛异常时的传入参数?
4、谁调用了某个方法,具体调用链?
Btrace登场 - 无需再重新修改代码上线了,太慢了
PS Btrace无法方法中获取局部变量的值,因此可以使用JBoss提供的Byteman
实现原理
Attach API + BTrace脚本解析引擎 + ASM + JDK Instumentation。
特别注意
BTrace为了安全考虑,为了保证trace语句只读,最小化对被检测程序造成影响, BTrace对trace脚本有一些限制(比如不能改变被trace代码中的状态)
- BTrace class不能新建类, 新建数组, 抛异常, 捕获异常,
- 不能调用实例方法以及静态方法(com.sun.btrace.BTraceUtils除外)
- 不能将目标程序和对象赋值给BTrace的实例和静态field
- 不能定义外部, 内部, 匿名, 本地类
- 不能有同步块和方法
- 不能有循环
- 不能实现接口, 不能扩展类
- 不能使用assert语句, 不能使用class字面值
使用案例
网友评论