Java 线上问题排查神器 BTrace 入门

文章目录
  1. 1. 介绍
  2. 2. 安装
    1. 2.1. 下载地址:Btrace-1.3.11
    2. 2.2. 配置环境变量
    3. 2.3. 验证安装是否正确
  3. 3. Btrace运行脚本方式
  4. 4. Btrace 注解
  5. 5. 使用示例
    1. 5.1. 新建一个springboot的web工程引入btrace的maven相关依赖
    2. 5.2. 编写要追踪调试的代码
    3. 5.3. 编写追踪代码
    4. 5.4. 运行

介绍

BTrace是Java平台的安全,动态跟踪工具。

BTrace可用于动态跟踪正在运行的Java程序(类似于OpenSolaris应用程序和操作系统的DTrace)。 BTrace动态检测目标应用程序的类以注入跟踪代码(“字节码跟踪”)

BTrace是检查和解决线上的问题的利器,BTrace 可以通过编写脚本的方式,在服务不用重启的情况下,获取程序执行过程中相关信息。

安装

下载地址:Btrace-1.3.11

下载完成,进行解压,自行放入读者自己的安装目录

1
2
# 解压
$ tar -zxvf btrace-bin-1.3.11.tgz.tar.gz
配置环境变量
  • MaxOs用户

    编辑 ~/.bash_profile 文件添加

1
2
3
# btrace(BTRACE_HOME的路径记得替换成自己的btrace的目录)
export BTRACE_HOME=/Users/gulj/Applications/developsoftware/btrace
export PATH=$PATH:$BTRACE_HOME/bin

让.bash_profile生效

1
$ source ~./bash_profile
  • Window用户

    编辑:右键—>我的电脑—>我的电脑—>属性—>高级系统设置—>环境变量—>系统变量

    在系统变量中新建环境变量 BTRACE_HOME

1
BTRACE_HOME=/Users/gulj/Applications/developsoftware/btrace

在系统变量中找到path,在后面添加

1
%BTRACE_HOME%\bin
验证安装是否正确
1
2
3
$ btrace --version

BTrace v.1.3.11 (20180406)

Btrace运行脚本方式

  • 在JVisual中添加Btrace插件,添加classpath
  • 使用命令行 btrace [-I include-path] [-p port] [-cp classpath] pid btrace-script [args]

Btrace 注解

在我们解压后的/Users/gulj/Applications/developsoftware/btrace/docs目录下,有个usersguide.html文件,里面详细介绍了各种注解的作用以及使用方法

  • Method Annotations
    • @com.sun.btrace.annotations.OnMethod
    • @com.sun.btrace.annotations.OnTimer
    • @com.sun.btrace.annotations.OnError
    • @com.sun.btrace.annotations.OnExit
    • @com.sun.btrace.annotations.OnEvent
    • @com.sun.btrace.annotations.OnLowMemory
    • @com.sun.btrace.annotations.OnProbe
  • Argument Annotations
    • @com.sun.btrace.annotations.Self
    • @com.sun.btrace.annotations.Return
    • @com.sun.btrace.annotations.CalledInstance
    • @com.sun.btrace.annotations.CalledMethod
  • Field Annotations
    • @com.sun.btrace.annotations.Export
    • @com.sun.btrace.annotations.Property
    • @com.sun.btrace.annotations.TLS
  • Class Annotations
    • @com.sun.btrace.annotations.DTrace
    • @com.sun.btrace.annotations.DTraceRef
    • @com.sun.btrace.annotations.BTrace

使用示例

新建一个springboot的web工程引入btrace的maven相关依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!-- btrace start -->
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-boot</artifactId>
<scope>system</scope>
<version>1.3.11</version>
<type>jar</type>
<systemPath>/Users/gulj/Applications/developsoftware/btrace/build/btrace-boot.jar</systemPath>
</dependency>

<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-client</artifactId>
<scope>system</scope>
<version>1.3.11</version>
<type>jar</type>
<systemPath>/Users/gulj/Applications/developsoftware/btrace/build/btrace-client.jar</systemPath>
</dependency>

<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-agent</artifactId>
<scope>system</scope>
<version>1.3.11</version>
<type>jar</type>
<systemPath>/Users/gulj/Applications/developsoftware/btrace/build/btrace-agent.jar</systemPath>
</dependency>
<!-- btrace end -->
编写要追踪调试的代码
1
2
3
4
5
6
7
@RestController
public class UserController {
@GetMapping("/hello")
public String helloBtrace(@RequestParam("name") String name) {
return "hello," + name;
}
}
编写追踪代码
1
2
3
4
5
6
7
8
9
10
11
12
@BTrace
public class BtracePrintArgSimple {
@OnMethod(
clazz = "com.gulj.monitor.controller.UserController",
method = "helloBtrace",
location = @Location(Kind.ENTRY)
)
public static void andyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println("className=" + pcn + "," + "methodName" + pmn);
}
}
运行

先把我们的springboot工程启动,通过 jps -l 取得工程的pid ,然后在执行

1
2
# 49165 就是笔者工程的pid
btrace 49165 BtracePrintArgSimple.java

这样我们的追踪代码就处于一直监控状态,此时,我们通过curl、postman等方式,请求我们写好的接口

1
curl http://localhost:8080/hello?name="btrace"

那么我们的btrace监控就会输出我们监控的结果

追踪的代码(BtracePrintArgSimple)可以单独存放,新建一个工程,不必和我们的业务工程放在一起