Btrace使用入门
目录
1.什么是BTrace
2.BTrace使用场景
BTrace可以做什么?
3.使用限制
4.使用方法及样例
4.1使用方法
4.2使用样例
2.查看哪些方法调用了 System.gc() ,调用栈是怎样的
3.打印某个类中某一方法的入参和返回值
5.拦截方法定义
定位方法
拦截时机
参考资料
1.什么是BTrace
BTrace是sun公司推出的一款Java 动态、安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。
2.BTrace使用场景
在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉。一般情况下是通过修改程序,添加打印日志;然后重新发布程序来完成。
然而,这不仅麻烦,而且带来很多不可控的因素。有没有一种方式,在不修改原有运行程序的情况下获取运行时的数据信息呢?如方法参数、返回值、全局变量、堆栈信息等。
BTrace可以做什么?
BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存在以下问题的时候,可以用 BTrace。
比如哪些方法执行太慢,例如监控执行时间超过1s的方法
查看哪些方法调用了 System.gc() ,调用栈是怎样的
查看方法参数或对象属性
哪些方法发生了异常
3.使用限制
为了保证trace语句只读,最小化对被检测程序造成影响, BTrace对trace脚本有一些限制(比如不能改变被trace代码中的状态):
不能创建对象
不能使用数组
不能抛出或捕获异常
不能使用循环
不能使用synchronized关键字
属性和方法必须使用static修饰
需要特别注意的是:不恰当的使用BTrace可能导致JVM崩溃,如在BTrace脚本使用错误的class文件,所以在上生产环境之前,务必在本地充分的验证脚本的正确性。
4.使用方法及样例
4.1使用方法
1.安装和配置
2.btrace $PID $监控脚本
3.BTrace脚本在进程重启后会失效。
注意:需要使用【btracec 监控脚本】命令对监控脚本进行预编译,可以在运行前发现错误。特别是应用到线上环境,必须强制先预编译一下,看是否报错。
4.2使用样例
1.监控方法的耗时
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class CheckOnlineStatus{//监控某一个方法的执行时间//这里是监控 BtraceServiceImpl 方法中 getCount 的调用情况。duration是以纳秒为单位的,所以换算成ms比较好看一点 ,其他例子也是如此考虑。@OnMethod(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",location=@Location(Kind.RETURN))public static void printMethodRunTime(@ProbeClassName String probeClassName,@Duration long duration){println(probeClassName + ",duration:" + duration / 1000000 + " ms");}//统计调用时间超过100ms的方法@OnMethod(clazz = "/com\\.kite\\.controller\\..*/",method = "/.*/",location = @Location(Kind.RETURN)) public static void slowQuery(@ProbeClassName String pcn,@ProbeMethodName String probeMethod, @Duration long duration){if(duration > 1000000 * 100){println(strcat("类:", pcn))println(strcat("方法:", probeMethod));println(strcat("时长:", str(duration / 1000000)));}} }
2.查看哪些方法调用了 System.gc() ,调用栈是怎样的
import com.sun.btrace.AnyType; import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class ServiceMonitor{//查看谁调用了System.gc(),并打印调用栈@OnMethod(clazz = "java.lang.System", method = "gc")public static void onSystemGC() {println("entered System.gc()");jstack();} }
3.打印某个类中某一方法的入参和返回值
import com.sun.btrace.AnyType; import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class ServiceMonitor{//监控某一个方法的执行时间@OnMethod(clazz = "com.joson.btrace.service.BtraceService",method = "getCount",location=@Location(Kind.RETURN))public static void printMethodRunTime\(@Self Object self,String type,Integer limit,@Return AnyType result){println( "type: " + type + " ,limit: " + limit );println("result : " + result);} }
这里是监控 BtraceService 类中 getCount 方法的所有入参及返回值
对于入参,不需要打印的也可以不定义 但是定义一定要按顺序。比如参数列表不能放在返回值的后面。
对于返回值类型 如果是非基本类型 则直接用 AnyType 类型即可。
5.拦截方法定义
@OnMethod 可以指定 clazz 、method、location。
由此组成了在什么时机(location 决定)监控某个类/某些类(clazz 决定)下的某个方法/某些方法(method 决定)。
定位方法
1. 精准定位
直接定位到一个类下的一个方法
2. 正则表达式定位
正则表达式在两个"/" 之间,例如下面的例子,监控 javax.swing 包下的所有方法,注意正式环境中,范围尽可能小一点,太大了性能会有影响。
@OnMethod(clazz="/javax\\.swing\\..*/", method="/.*/") public static void swingMethods( @ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {print("entered " + probeClass + "." + probeMethod); }
通过在拦截函数的定义里注入@ProbeClassName String probeClass, @ProbeMethodName String probeMethod 参数,告诉脚本实际匹配到的类和方法名。
3. 按接口或继承类定位
例如要匹配继承或实现了 com.kite.base 的接口或基类的,只要在类前加上 + 号就可以了,例如
@OnMethod(clazz="+com.kite.base", method="doSome")
4. 按注解定位
在前面加上 @ 即可,例如
@OnMethod(clazz="@javax.jws.WebService", method="@javax.jws.WebMethod")
拦截时机
拦截时机由 location 决定,当然也可为同一个定位加入多个拦截时机,即可以在进入方法时拦截、方法返回时拦截、抛出异常时拦截
1. Kind.Entry与Kind.Return
分别表示函数的开始和返回,不写 location 的情况下,默认为 Kind.Entry,仅获取参数值,可以用 Kind.Entry ,要获取返回值或执行时间就要用 Kind.Return
2. Kind.Error, Kind.Throw和 Kind.Catch
表示异常被 throw 、异常被捕获还有异常发生但是没有被捕获的情况,在拦截函数的参数定义里注入一个Throwable的参数,代表异常
@OnMethod(clazz = "java.net.ServerSocket", method = "bind", location =@Location(Kind.ERROR)) public static void onBind(Throwable exception, @Duration long duration){ }
3. Kind.Call 和 Kind.Line
Kind.Call 表示被监控的方法调用了哪些其他方法,例如:
@OnMethod(clazz = "com.kite",method = "login",location = @Location(value = Kind.CALL, clazz = "/.*/", method = "/.*/", where = Where.AFTER)) public static void onBind(@Self Object self, @TargetInstance Object instance, @TargetMethodOrField String method, @Duration long duration){println(strcat("self: ", str(self)));println(strcat("instance: ", str(instance)));println(strcat("method: ", str(method)));println(strcat("duration(ms): ", str(duration / 1000000))); }
@Self 表示当前监控的函数所在类,如果是静态类则为空,@TargetInstance 表示函数中调用的方法或属性所在的类,如果是静态方法则为空,@TargetMethodOrField 表示调用的方法或属性,如果要获取执行时间,那么 where 必须设置为 Where.AFTER
Kind.Line 监测类是否执行到了设置的行数,例如:
@OnMethod(clazz = "com.kite.demo", location = @Location(value = Kind.LINE, line = 20)) public static void onBind() {println("执行到第20行") }
参考资料
https://www.gitbook.com/book/json-liu/btrace/details BTrace使用手册
https://github.com/btraceio/btrace BTrace github
https://www.jianshu.com/p/a396d8893a4c greys
Btrace使用入门相关推荐
- BTrace快速入门
概述 btrace是sun的一款java动态诊断工具.可以在运行中的java类中动态的注入trace代码,这样我们就可以在不停机的情况下获取方法的入参,返回值,等信息,从而达到监控调试的目的.但是使用 ...
- 神器BTrace快速入门
1.使用背景 生产环境系统发生问题时,定位问题需要获取系统运行时的相关数据,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据,需要修改代码,将数据输出到日志文件,再发布到生产环境.这种方式, ...
- java btrace_基于Btrace的监控调试
btrace快速入门 简介: BTrace是Java的安全可靠的动态跟踪工具. 它的工作原理是通过 instrument + asm 来对正在运行的java程序中的class类进行动态增强.也就是说b ...
- 【基于Btrace的监控调试】
Btrace简介(Docker可选择阿里arthas) 建议使用JDK8 Btrace可以动态地向目标应用程序的字节码注入追踪代码. JavaComplierApi.JVMTI.Instrumenta ...
- Btrace入门到熟练小工完全指南
BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都是可疑的. BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息.而不需要不断地修改代码, ...
- 性能工具之Java分析工具BTrace入门
文章目录 一.引言 二.BTrace是什么? 三.BTrace原理 四.安装配置 五.注意事项 六.使用示例 1.拦截一个普通方法 2.拦截构造函数 3.拦截同名函数,以参数区分 4.拦截方法返回值 ...
- 性能工具之Java调试工具BTrace入门
引言 在我们对Java应用做问题分析的时候,往往采用log进行问题定位和分析,但是如果我们的log缺乏相关的信息呢?远程调试会影响应用的正常工作,修改代码重新部署应用,实时性和灵活性难以保证,有没有不 ...
- envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...
- BTrace使用小结
简介 BTrace是一个安全的JVM动态追踪工具,最初为原Sun公司Kenai项目下面的一个子项目. 典型的使用场景是,"我要查个问题,可那个方法没有打印入口参数和返回结果日志", ...
最新文章
- hdu3724 字典树(商品条形码)
- UA MATH571B 试验设计 总结 试验的类型与选择
- android 绘制5格电量,Android 如何把状态栏信号格改为5格
- 渗透测试中dns log的使用
- PAT1096 Consecutive Factors (20)(逻辑)
- Java 设计模式-【单例模式】
- SqoopFlume、Flume、HDFS之间比较
- 湛江市计算机等级考试,2020广东省湛江市计算机等级考试注意事项
- CCNA之网络地址转换(NAT)简介
- Java自动化测试框架-04 - TestNG之Test Method篇 - (详细教程)
- Java 设计模式 之 单例模式(Singleton)
- Vue速成day01
- 红米k30至尊纪念版和华为mate30pro哪个值得买
- Dubbo NoSuchMethodException: Not found method “xxx“ in class xxx问题解决
- 日本股神是川银藏:从店员到炒股大王
- GitHub操作流程
- PMP除了应征PM职位外哪些职位可能会用到呢?
- 常用技术指标之一文读懂RSI指标
- Java实现字符串排序
- 震惊!TYPE-C 转OTG(USB2.0传输数据)+PD充电协议芯片