【JVM】基于BTrace的监控调试

文章目录

    • 1. Btrace 安装与运行
    • 2. Btrace入门测试
      • 2.1 接口编写
      • 2.2 Btrace 脚本编写 + 使用命令行启动脚本
      • 2.3 使用 JVisualVM 启动 Btrace 脚本
    • 3. Btrace 使用详解
      • 3.1 拦截方法
      • 3.2 拦截时机
    • 4. Btrace 注意事项

BTrace 可以在不停止目标程序的前提下,通过 HotSwap 技术动态向目标应用程序的字节码加入追踪代码,从而达到调试目的。

1. Btrace 安装与运行

  1. 访问 https://github.com/btraceio/btrace/releases/tag/v1.3.11.3 下载需要的版本,我下载的是
    【JVM】基于BTrace的监控调试_第1张图片
  2. 解压并配置环境变量 BTRACE_HOME,Path
    ==2==
    ==3==
  3. 运行Btrace方式
    【JVM】基于BTrace的监控调试_第2张图片

2. Btrace入门测试

本文详细代码见文末链接

2.1 接口编写

  1. 新建Controller 模拟一个线上生产环境中的接口
@RestController
@RequestMapping("btrace")
public class BtraceController {
	
	@RequestMapping("/arg1")
	public String arg1(@RequestParam("name")String name) {
		return "hello,"+name;
	}
}
  1. 浏览器访问 http://localhost:8080/btrace/arg1?name=test 测试接口成功返回。

2.2 Btrace 脚本编写 + 使用命令行启动脚本

以下演示 Btrace 在不停止程序运行的情况下获取 方法参数name 的详细步骤

  1. 首先导入 Btrace的相关依赖,其中 F:\ruanjian\btrace-bin-1.3.11.3 为第一章第2步的btrace安装目录。
<dependency> 
		    <groupId>com.sun.btracegroupId> 
		    <artifactId>btrace-agentartifactId> 
		    <version>1.3.11version> 
		    <type>jartype> 
		    <scope>systemscope> 
		    <systemPath>F:\ruanjian\btrace-bin-1.3.11.3\build\btrace-agent.jarsystemPath> 
		dependency>
		<dependency> 
		    <groupId>com.sun.btracegroupId> 
		    <artifactId>btrace-bootartifactId> 
		    <version>1.3.11version> 
		    <type>jartype> 
		    <scope>systemscope> 
		    <systemPath>F:\ruanjian\btrace-bin-1.3.11.3\build\btrace-boot.jarsystemPath> 
		dependency>
		<dependency> 
		    <groupId>com.sun.btracegroupId> 
		    <artifactId>btrace-clientartifactId> 
		    <version>1.3.11version> 
		    <type>jartype> 
		    <scope>systemscope> 
		    <systemPath>F:\ruanjian\btrace-bin-1.3.11.3\build\btrace-client.jarsystemPath> 
		dependency>
  1. 编写 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表示在方法刚执行时
  1. 使用命令行方式启动脚本,cd到脚本目录下,先使用 jps -l 命令查看进程id ,然后执行 btrace 23120 PrintArgSimple.java 运行脚本

  2. 浏览器访问 http://localhost:8080/btrace/arg1?name=btrace2 会发现 btrace 打印了相关信息
    【JVM】基于BTrace的监控调试_第3张图片

2.3 使用 JVisualVM 启动 Btrace 脚本

以下所有操作均在 JVisualVM 中,JVisualVM .exe 在本机JDK的bin目录下

  1. 先在JVisualVM导入 Btrace插件 :工具-插件-可用插件-Btrace Workbench - 安装
  2. 在本地进程右击打开 Trace Application,进入下图界面
    【JVM】基于BTrace的监控调试_第4张图片
  3. 复制上面的脚本(如果脚本中引入JDK原生jar包之外的资源,需要 配置classPath)
  4. 浏览器访问 http://localhost:8080/btrace/arg1?name=btrace4 会发现 打印了相关信息
    【JVM】基于BTrace的监控调试_第5张图片

3. Btrace 使用详解

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

3.1 拦截方法

【JVM】基于BTrace的监控调试_第6张图片

  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=""
	)

其余步骤请见:Btrace 拦截构造函数,同名函数

3.2 拦截时机

拦截时机也就是在什么时候拦截,主要分为4种

Kind.ENTRY 入口,默认值
Kind.RETURN: 返回
Kind.THROW: 异常
Kind.Line: 行

详细使用方式请参考:Btrace 拦截时机

btrace的使用还有很多方式,详细的等用到再网上查吧。

4. Btrace 注意事项

  1. btrace默认只能本地运行
  2. 生产环境下可以使用btrace,但是被btrace注入的代码不会还原,当然,jvm重启是会还原的。所以,不要编写太耗费性能的脚本

你可能感兴趣的:(jvm,jvm)