文章目录
- Java程序排查问题利器之Btrace
- 背景
- Btrace的介绍
- Btrace的一些限制
- Btrace能干什么
- Btrace的安装
- Btrace使用示范
- 模拟测试
Java程序排查问题利器之Btrace
Btrace Github地址:Btrace 5.7K star Btrace wiki Github 地址:Btrace Wiki 提供了文档、案例
原作者博客主页:我是攻城师
背景
平时我们调试运行中 java程序的时候使用阿里的arthas工具比较多,今天同事在本地debug的时候发现一个问题,如果接口代码断点进去之后,后续进了一个异步线程,去异步线程里弄一个断点,下一步会在异步线程里断点上停住,而接口凭直觉应该接口请求用的线程会继续执行,返回请求的响应,但是没有,一直等到异步断点执行完才返回请求结果,于是好奇想看看debug的实现原理,看到了几篇博客,顺便记录一下,下次方便直接看自己收录的。结论是当debug断点住的时候直接把其他线程全部挂起了,都停住了没有继续执行。
JVM 断点原理()
JVM TI(tool interface工具接口) https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html JVM Bytecode Instrumentation https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#bci
Btrace的介绍
BTrace是Java的安全可靠的动态跟踪工具。 他的工作原理是通过 instrument + asm 来对正在运行的java程序中的class类进行动态增强,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。
正如上面描述的一些特性,所以btrace一般是用来排查生产环境jvm问题的一款利器,使用它不用再担心应用程序的日志打的不够全,不够细,也不用为了排查问题一遍遍的重启程序。
Btrace的一些限制
由于Btrace会把脚本逻辑直接侵入到运行的代码中,所以在使用上做很多限制:
1、不能创建对象
2、不能使用数组
3、不能抛出或捕获异常
4、不能使用循环
5、不能使用synchronized关键字
6、属性和方法必须使用static修饰
此外不恰当的使用BTrace可能导致生产程序直接挂掉,所以在上生产环境之前,务必在开发环境充分验证脚本的正确性。
可用的注解
https:///btraceio/btrace/wiki/BTrace-Annotations @OnMethod
@OnTimer
@OnError
@OnExit
@OnEvent
@OnLowMemory
@OnProbe
@Sampled
Argument Annotations
@ProbeClassName
@ProbeMethodName
@Selfs
@Return
@Duration
@TargetInstance
@TargetMethodOrField
Btrace能干什么
(1)分析任意接口或者方法的耗时情况
(2)分析不断的添加数据时,Map的扩容情况
(3)分析那个方法里面调用了System.gc()方法,并打印出其调用栈
(4)某些方法抛出异常时,分析其运行参数
(5)统计一些接口的调用次数
(6)分析一些方法的代码是否执行到了某一行
(7)…比如哪些方法执行太慢,例如监控执行时间超过1s的方法
查看哪些方法调用了 System.gc() ,调用栈是怎样的
查看方法参数或对象属性
哪些方法发生了异常
多说一点,为了更好解决问题,最好还要配合事前准备和进行中监控,事前准备就是埋点嘛,在一些可能出现问题的方法中进行日志输出,进行中监控就是利用一些实时监控工具,例如 VisualVM 、jmc 这些带界面的工具或者 jdk 提供的命令行工具等,再高级一点的就是利用 Graphite 这样的Metrics 工具配合 web 界面展示出来。
注意上面的所有操作,都是监控正在运行中的程序,基本不会产生任何影响。
Btrace的安装
(1)从github上下载最新的二进制包 ,版本是1.3.10.2
wget https:///btraceio/btrace/releases/download/v1.3.10.2/btrace-bin-1.3.10.2.tgz
(2)解压到指定路径
(3)设置环境变量
(4)验证安装是否成功
(5)查看btrace的帮助文档
Btrace使用示范
注意btrace在maven上发布的jar,版本非常低,都是几年前的版本了,如果要编写btrace脚本,建议把安装目录下三个核心jar直接拷贝到工程中临时使用即可,如果想要随时使用,也可以将其上传到你们公司的maven私服上。
(1)在使用btrace之前,我们先需要写一个简单的java程序,模拟成是线上正在跑的程序代码比较简单,就是每隔随机的时间,随机生成两个整数,进行求和:
(2)主程序已经有了,下面就需要我们写btrace脚本,来监控"我们的线上程序了" 注意,需要在工程里面引入上面提到的3个jar。监控的代码如下:
模拟测试
经过上一阶段,我们已经准备好了模拟程序和监控脚本,下面来部署测试下:
(1)首先,通过maven将模拟程序打包成一个jar
(2)选择一台linux机器将jar包上传
(3)执行命令,启动模拟程序
(4)打开另一个linux终端部署监控脚本OnlineDebug.java到指定目录
赋予执行权限:
执行jps命令,查看模拟程序的进程id启动监控脚本:
等待几秒后,控制台输出如下:
可以看到监控脚本已经生效,成功获取到了模拟程序的内部参数,以及执行时间等。此刻另一个终端的模拟程序还在 正常运行,但内部其实已经被增强了。
如何退出监控脚本?
非常简单,执行ctrl+c命令,选择1退出即可:
参考链接:
https:///btraceio/btrace/wiki/BTrace-Annotations
https://www.jianshu.com/p/93e94b724476