JVM(五)--Btrace 第一章 安装、下载、实战入门
-
前言
-
什么是Btrace呢?
答:就是在程序不重启,正在运行的情况下动态的修改字节码。
- Btrace用到什么技术呢?
JavaComplierAp、JVMTI、Agent、Instrumentation+ASM
-
Btrace安装
- 新建环境变量BTRACE_HOME
- 添加Path:%BTRACE_HOME%\bin
下载的对应系统版本的btrace网址
https://github.com/btraceio/btrace
操作演示 下载zip和环境变量配置.
-
两种运行脚本方式
- 在JVisualVM中添加Btrace插件,添加classpath
- 使用命令行btrace <pid> <trace_script>
-
Btrace实战
import com.gisquest.realestate.vo.ResponseBodyVo;
import com.gisquest.realestate.vo.ResponseStatus;
import org.springframework.web.bind.annotation.*;
/**
* Btrace实战:如何在程序不做修改的情况下获取name参数
*
* @param * @Param: null
* @return
* @date 2019-01-23 15:18
*/
@RestController
@RequestMapping("ch4")
public class BtraceDemoController {
@RequestMapping("/arg1")
public
@ResponseBody
ResponseBodyVo<String> arg1(@RequestParam("name") String name) {
return new ResponseBodyVo<>(ResponseStatus.OK, "hello" + name);
}
}
package com.gisquest.zrzy.platform.client.frmdept;
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*;
/**
* class method location 声明:
* 拦截com.gisquest.zrzy.platform.client.frmdept.BtraceDemoController下的arg1方法,并且在入口处拦截
* PS:通过BTrace标签声明,以下是Btrace脚本,Btrace与实际的java代码没有关系,不存在偶合
*
* @param
* @return
* @date 2019-01-23 15:37
*/
@BTrace
public class PrintArgSimple {
@OnMethod(
clazz = "com.gisquest.zrzy.platform.client.frmdept.BtraceDemoController",
method = "arg1",
location = @Location(Kind.ENTRY)
)
/**
* 通过规则ID获取数据
*
* @Param: pcn 拦截方法类的类名
* @Param: pmn 拦截的方法名
* @Param: args 参数
* @return void
* @date 2019-01-23 15:44
*/
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn + "," + pmn);
BTraceUtils.println();
}
}
-
Btrace监控命令操作
- 可支持命令
- 命令操作
注意:如果是在方法中写了注释,汇报错GBK等...,返回的数组是参数 AnyType[]
- 插件操作
- 看上一篇文章,注意路径,勾选BTrace Workbench即可,安装完后选中项目进程我自己是MicroPlatformApp,右键Trace aplication
未完待续。。。。