目录

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使用入门相关推荐

  1. BTrace快速入门

    概述 btrace是sun的一款java动态诊断工具.可以在运行中的java类中动态的注入trace代码,这样我们就可以在不停机的情况下获取方法的入参,返回值,等信息,从而达到监控调试的目的.但是使用 ...

  2. 神器BTrace快速入门

    1.使用背景 生产环境系统发生问题时,定位问题需要获取系统运行时的相关数据,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据,需要修改代码,将数据输出到日志文件,再发布到生产环境.这种方式, ...

  3. java btrace_基于Btrace的监控调试

    btrace快速入门 简介: BTrace是Java的安全可靠的动态跟踪工具. 它的工作原理是通过 instrument + asm 来对正在运行的java程序中的class类进行动态增强.也就是说b ...

  4. 【基于Btrace的监控调试】

    Btrace简介(Docker可选择阿里arthas) 建议使用JDK8 Btrace可以动态地向目标应用程序的字节码注入追踪代码. JavaComplierApi.JVMTI.Instrumenta ...

  5. Btrace入门到熟练小工完全指南

    BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都是可疑的. BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息.而不需要不断地修改代码, ...

  6. 性能工具之Java分析工具BTrace入门

    文章目录 一.引言 二.BTrace是什么? 三.BTrace原理 四.安装配置 五.注意事项 六.使用示例 1.拦截一个普通方法 2.拦截构造函数 3.拦截同名函数,以参数区分 4.拦截方法返回值 ...

  7. 性能工具之Java调试工具BTrace入门

    引言 在我们对Java应用做问题分析的时候,往往采用log进行问题定位和分析,但是如果我们的log缺乏相关的信息呢?远程调试会影响应用的正常工作,修改代码重新部署应用,实时性和灵活性难以保证,有没有不 ...

  8. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

    1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...

  9. BTrace使用小结

    简介 BTrace是一个安全的JVM动态追踪工具,最初为原Sun公司Kenai项目下面的一个子项目. 典型的使用场景是,"我要查个问题,可那个方法没有打印入口参数和返回结果日志", ...

最新文章

  1. hdu3724 字典树(商品条形码)
  2. UA MATH571B 试验设计 总结 试验的类型与选择
  3. android 绘制5格电量,Android 如何把状态栏信号格改为5格
  4. 渗透测试中dns log的使用
  5. PAT1096 Consecutive Factors (20)(逻辑)
  6. Java 设计模式-【单例模式】
  7. SqoopFlume、Flume、HDFS之间比较
  8. 湛江市计算机等级考试,2020广东省湛江市计算机等级考试注意事项
  9. CCNA之网络地址转换(NAT)简介
  10. Java自动化测试框架-04 - TestNG之Test Method篇 - (详细教程)
  11. Java 设计模式 之 单例模式(Singleton)
  12. Vue速成day01
  13. 红米k30至尊纪念版和华为mate30pro哪个值得买
  14. Dubbo NoSuchMethodException: Not found method “xxx“ in class xxx问题解决
  15. 日本股神是川银藏:从店员到炒股大王
  16. GitHub操作流程
  17. PMP除了应征PM职位外哪些职位可能会用到呢?
  18. 常用技术指标之一文读懂RSI指标
  19. Java实现字符串排序
  20. 震惊!TYPE-C 转OTG(USB2.0传输数据)+PD充电协议芯片

热门文章

  1. 新零售如何推广 新零售模式有哪些经典案例?
  2. nginx正向代理+反向代理
  3. 消息称华硕将大规模裁员
  4. 蚂蚁、字节、滴滴面试经历总结(都已过)
  5. 苹果将终止照片处理软件iPhoto及Aperture开发
  6. EXCEL--多条件3(if嵌套/判断)
  7. ios开发----文件管理
  8. 【Java实习生面试题系列】-- JVM篇一
  9. 近期百度大规模K站的分析总结
  10. 智能运维,为新型数据中心注入科技动能