【JVM】基于BTrace的监控调试


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

1. Btrace 安装与运行

  1. 访问 https://github.com/btraceio/btrace/releases/tag/v1.3.11.3 下载需要的版本,我下载的是
    ==1==
  2. 解压并配置环境变量 BTRACE_HOME,Path
    ==2==
    ==3==
  3. 运行Btrace方式
    ==4==

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.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>
  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 打印了相关信息
    ==6==

2.3 使用 JVisualVM 启动 Btrace 脚本

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

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

3. Btrace 使用详解

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

3.1 拦截方法

==9==

  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 注意事项

  1. btrace默认只能本地运行
  2. 生产环境下可以使用btrace,但是被btrace注入的代码不会还原,当然,jvm重启是会还原的。所以,不要编写太耗费性能的脚本
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值