线上排查问题的利器——Btrace

开发 后端
Btrace 是一个安全,可以动态跟踪 java 程序的一种工具。他的操作不会对原有 java 进程产生影响,不用关闭正在运行的 java 进程,也不会修改 java 进程中的逻辑和数据。因此,也就成为我们线上跟踪生产代码的有力工具!

之前 Btrace 只是听说过,但还没有具体的用到。最近在排查线上问题的时候,使用了 Btrace ,发现 Btrace 真是在关键时候的利器。

Btrace 是一个安全,可以动态跟踪 java 程序的一种工具。

他的操作不会对原有 java 进程产生影响,不用关闭正在运行的 java 进程,也不会修改 java 进程中的逻辑和数据。

因此,也就成为我们线上跟踪生产代码的有力工具!

Btrace 的脚本编写也非常简单:和写 Java 代码一样的,因此对于我们,学习的曲线几乎是平坦的。

下面就分享一下 Btrace 的一些用法:

如何使用 Btrace

基本用法: trace

其中, btrace 是在 btrace 下载包中的命令 , pid 是 JVM 的进程 id , btrace-script 是编写的 btrace 脚本。

Btrace 中的一些概念

Probe Point : 关注点。就是我们要关注应用程序中要执行的“地方”,或者是一些“事件”的发生。

Trace Action : 就是触发了 probe point 的时候,我们所要执行的动作。

Action Methods :我们的 trace action 都是写在某个类的静态方法中的,这个静态方法,就是 action method 。

Btrace 中的一些限制:

Btrace 的初衷是要“跟踪代码”,而不是修改代码,因此他要保证我们注入的脚本,是安全的,对应用程序来说是“只读”的。也就是说不能修改应用程序的代码或者数据。因此 Btrace 中有一些限制,主要有:

不能新建对象

不能抛异常

不能 catch 异常

不能调用实例方法和静态方法。只能调用 Btrace 提供的 com.sun.btrace.BTraceUtils 中的方法和自己在脚本中定义的方法。

不能有循环

不能有断言

……

初看起来,好像限制蛮多的。不过, com.sun.btrace.BTraceUtils 提供的方法很多,足够我们来“跟踪”代码了。而且,这些限制也是必要的,因为我们只是到那个 JVM 去看看,看看而已。

一个简单的 Btrace 脚本例子,其实就是 Java 代码

 

 

其中:

其中类名需要加上 @Btrace 的注释,以表示是 Btrace 脚本

OnMethod 表示一个 probe point ,这个就表示当执行到 java.awt.Component 这个类的 方法(这个是 Component 的构建方法)时,就触发 func 方法。

@Self 表示这个被实例化的 Component 的引用

@OnTimer 表示事件(通过时间)触发的 probe point ,每隔 2 秒触发一次

相信程序不用做过多解释,大家都知道,终端将会打印出从跟踪开始, Component 被实例化的个数。

支持的跟踪类型

Btrace 支持的跟踪类型有很多了,包括可以跟踪:

跟踪到某个实例方法的触发

跟踪到某个接口方法的触发

跟踪到触发方法的参数,返回值

可以将当前触发的线程堆栈打印出来

设置还可以跟踪某个方法中的哪一行代码被执行到

Btrace 的 User Guide

http://kenai.com/projects/btrace/pages/UserGuide

关于 Btrace 的原理

详情可见: http://victorzhzh.javaeye.com/blog/965789

什么时候用 Btrace

虽然 Btrace 在关键时候能起到迅速排查问题的作用,但我个人感觉,这还是不到万不得已才使用的好。

首先,我们代码上线前,应该充分 review ,充分和相关方进行沟通,以避免不必要的问题发生。

其次,我们应该养成记 log 的良好习惯。遇到问题,如果有相关日志可以排查,是最方便的,同时,也是最安全,成本***的一种排查方法。

***,我们可以结合 btrace 和 jdk 自带的 tool 来排查问题,比如 jstack , jstat 等等,快速的定位问题。

以上就是本人刚开始使用 Btrace 的一些成果,希望能对大家排查问题带来一些作用 。

【编辑推荐】

  1. MyEclipse 8.6 for Spring发布 新增iPhone工具
  2. MyEclipse 8.6正式版发布 以Eclipse 3.5.2为核心
  3. MyEclipse 8.6 M1发布 支持更多服务器
责任编辑:金贺 来源: JavaEye博客
相关推荐

2017-10-12 12:24:50

java

2024-08-14 14:20:00

2017-08-18 22:40:33

线上线程备份

2023-03-02 08:53:57

排查问题效率经验

2021-07-14 13:50:51

Linux命令文件

2020-11-12 10:58:22

Logger级别技巧

2024-10-10 15:32:51

2021-12-26 00:10:39

二分法排查版本

2017-06-10 20:47:06

MySQL复制线程

2017-06-09 20:10:44

MySQL复制线程

2018-08-10 15:00:42

服务器内存排查

2020-04-28 09:46:34

线上问题排查

2018-12-10 10:30:40

阿里Linux命令

2021-11-23 21:21:07

线上排查服务

2024-03-18 09:24:00

索引失效SQL

2022-11-16 11:55:22

网络连接命令

2023-12-05 07:12:39

优化排查性能

2019-11-12 08:53:00

线上命令日志

2010-10-12 10:04:30

无法无线上网

2019-03-29 10:22:08

Linux系统故障技巧
点赞
收藏

51CTO技术栈公众号