文章目录
BTrace 可以在不停止目标程序的前提下,通过 HotSwap 技术动态向目标应用程序的字节码加入追踪代码,从而达到调试目的。
1. Btrace 安装与运行
- 访问 https://github.com/btraceio/btrace/releases/tag/v1.3.11.3 下载需要的版本,我下载的是
- 解压并配置环境变量 BTRACE_HOME,Path
- 运行Btrace方式
2. Btrace入门测试
本文详细代码见文末链接
2.1 接口编写
- 新建Controller 模拟一个线上生产环境中的接口
@RestController
@RequestMapping("btrace")
public class BtraceController {
@RequestMapping("/arg1")
public String arg1(@RequestParam("name")String name) {
return "hello,"+name;
}
}
- 浏览器访问 http://localhost:8080/btrace/arg1?name=test 测试接口成功返回。
2.2 Btrace 脚本编写 + 使用命令行启动脚本
以下演示 Btrace 在不停止程序运行的情况下获取 方法参数name 的详细步骤
- 首先导入 Btrace的相关依赖,其中 F:\ruanjian\btrace-bin-1.3.11.3 为第一章第2步的btrace安装目录。
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-agent</artifactId>
<version>1.3.11</version>
<type>jar</type>
<scope>system</scope>
<systemPath>F:\ruanjian\btrace-bin-1.3.11.3\build\btrace-agent.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-boot</artifactId>
<version>1.3.11</version>
<type>jar</type>
<scope>system</scope>
<systemPath>F:\ruanjian\btrace-bin-1.3.11.3\build\btrace-boot.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-client</artifactId>
<version>1.3.11</version>
<type>jar</type>
<scope>system</scope>
<systemPath>F:\ruanjian\btrace-bin-1.3.11.3\build\btrace-client.jar</systemPath>
</dependency>
- 编写 btrace 脚本,脚本编写方式其实就是java类的方式
注意:脚本可以随意放在哪个项目下,不一定要在目标应用程序下。同时,脚本中不能有注释。
@BTrace
public class PrintArgSimple {
@OnMethod(
clazz="com.imooc.monitor_tuning.btrace.BtraceController",
method="arg1",
location=@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
代码解释:
clazz="com.hust.monitor_tuning.btrace.BtraceController", // 拦截类
method="arg1", //拦截方法
location=@Location(Kind.ENTRY) // 拦截时间,Kind.ENTRY表示在方法刚执行时
-
使用命令行方式启动脚本,cd到脚本目录下,先使用
jps -l
命令查看进程id ,然后执行btrace 23120 PrintArgSimple.java
运行脚本 -
浏览器访问 http://localhost:8080/btrace/arg1?name=btrace2 会发现 btrace 打印了相关信息
2.3 使用 JVisualVM 启动 Btrace 脚本
以下所有操作均在 JVisualVM 中,JVisualVM .exe 在本机JDK的bin目录下
- 先在JVisualVM导入 Btrace插件 :工具-插件-可用插件-Btrace Workbench - 安装
- 在本地进程右击打开 Trace Application,进入下图界面
- 复制上面的脚本(如果脚本中引入JDK原生jar包之外的资源,需要 配置classPath)
- 浏览器访问 http://localhost:8080/btrace/arg1?name=btrace4 会发现 打印了相关信息
3. Btrace 使用详解
3.1 拦截方法
- 拦截构造函数部分代码
// com.hust.monitor_tuning.BtraceController
@RequestMapping("/constructor")
public User constructor(User user) {
return user;
}
PrintConstructor.java脚本
@OnMethod(
clazz="com.hust.monitor_tuning.monitortools.User",
method="<init>"
)
其余步骤请见:Btrace 拦截构造函数,同名函数
3.2 拦截时机
拦截时机也就是在什么时候拦截,主要分为4种
Kind.ENTRY 入口,默认值
Kind.RETURN: 返回
Kind.THROW: 异常
Kind.Line: 行
详细使用方式请参考:Btrace 拦截时机
btrace的使用还有很多方式,详细的等用到再网上查吧。
4. Btrace 注意事项
- btrace默认只能本地运行
- 生产环境下可以使用btrace,但是被btrace注入的代码不会还原,当然,jvm重启是会还原的。所以,不要编写太耗费性能的脚本