初识Btrace

Btrace就是一个脚本工具,利用Btrace我们可以向原本的代码植入字节码,达到一个实时监测代码运行的效果。通过学习Btrace能让你更有效地定位并分析代码中的问题。但是呢,也有需要注意的地方,第一点就是,脚本默认只能在本地编译运行(如果你认为自己脚本编码能力很强的话,可以通过改源代码的方式来进行远程编译),第二点就是,Btrace会向我们原有的代码植入字节码,这点是要注意的,会影响本身服务器的性能,所以在使用之前,千万在本地测试好。

加入下方QQ群,最新源码及安装包免费领取

工作原理

这边呢,直接放个传送门吧:https://www.cnblogs.com/zengkefu/p/5632120.html

下载以及安装(图文)

GitHub下载地址:https://github.com/btraceio/btrace/releases/tag/v1.3.11.3
全网最佳Btrace入门到精通教程(1)
这边呢,本地安装的话,我选择的是btrace-bin-1.3.11.3.zip
加压后,存放到自己电脑任意的目录下:
全网最佳Btrace入门到精通教程(1)
主要的三个包:
| 全网最佳Btrace入门到精通教程(1)
然后配置环境变量,新建系统环境变量:
全网最佳Btrace入门到精通教程(1)
全网最佳Btrace入门到精通教程(1)
安装成功验证,打开cmd输入

btrace --version    // 查看对应版本信息

实战入门

首先呢,需要自己新建一个web项目,当然,我这边也是有源码的,下面有QQ交流群(在群文件中自行下载),如果大家有疑问的话,可以在群里进行交流。另外大家可以访问https://start.spring.io新建一个spring boot的web项目

pom配置
        //添加btrace脚本asm依赖
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>
        //添加下列jar包
        <dependency>
            <groupId>com.sun.tools.btrace</groupId>
            <artifactId>btrace-agent</artifactId>
            <version>1.3.11</version>
            <scope>system</scope>
            <systemPath>D:/btrace/btrace-bin-1.3.11.3/build/btrace-agent.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.sun.tools.btrace</groupId>
            <artifactId>btrace-boot</artifactId>
            <version>1.3.11</version>
            <scope>system</scope>
            <systemPath>D:/btrace/btrace-bin-1.3.11.3/build/btrace-boot.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.sun.tools.btrace</groupId>
            <artifactId>btrace-client</artifactId>
            <version>1.3.11</version>
            <scope>system</scope>
            <systemPath>D:/btrace/btrace-bin-1.3.11.3/build/btrace-client.jar</systemPath>
        </dependency>
2.新建脚本

btrace脚本也是用java来写的哦,可参考官方用户指南:https://github.com/btraceio/btrace/wiki/BTrace-Annotations

package com.example.demo.test2;
import java.lang.reflect.Field;

import com.example.demo.test.User;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;

// btrace脚本注解标识
@BTrace
public class PrintArgComplex {
	
	// 用于指定方法中的目标类,目标方法和“位置”
	@OnMethod(
	        clazz="com.example.demo.test2.Ch4Controller",   // 监控的类名
	        method="arg1",   // 监控的方法名
	        location=@Location(Kind.ENTRY)    // 拦截时机,默认ENTRY,在入口时进行拦截
	)
    // @ProbeClassName 拦截的类名 @ProbeMethodNam 方法名,后面是参数
	public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, String name) {
		BTraceUtils.println(pcn+","+pmn);
        BTraceUtils.println("name :"+name);
		BTraceUtils.println();
    }
}

controller

@RestController
@RequestMapping("/ch4")
public class Ch4Controller {
	
	@RequestMapping("/arg1")
	public String arg1(@RequestParam("name")String name) {
		return "hello,"+name;
	}
3.运行并启动本地cmd

全网最佳Btrace入门到精通教程(1)
1.复制当前脚本所在的目录
这边我用的是idea 右键+Copy path
全网最佳Btrace入门到精通教程(1)
2.查看运行的java进程

jps -l

全网最佳Btrace入门到精通教程(1)
3.植入本地脚本

btrace [PID] <*.java>

其他Error解决办法:
全网最佳Btrace入门到精通教程(1)
假如脚本中,import 了没有使用的类,在进行植入时会报错
全网最佳Btrace入门到精通教程(1)
btrace退出时的操作
btrace在运行监控时,控制台是阻塞输入的。只有通过Ctrl+c,来向应用发送信号,btrace会有3个选项供选择:
1.exit(代表退出监控,回到btrace交互模式)
2.send an event(代表发送一个事件,会触发btrace去打印监控信息到控制台。如aggre 、file、druid、isearch、sql、sqlde命令均可以通过该方式,打印出监控信息)
3.send a named event (发送一个指定名称的事件)
4.flush console output (清空控制台输出)

4.输出结果的显示

全网最佳Btrace入门到精通教程(1)
以下是控制台输出
全网最佳Btrace入门到精通教程(1)

QQ群,本群作为Btrace讨论群,禁止发送不良及广告信息

全网最佳Btrace入门到精通教程(1)

相关文章:

  • 2021-12-31
  • 2021-09-10
  • 2021-08-09
  • 2022-03-03
  • 2021-10-26
  • 2021-10-11
猜你喜欢
  • 2022-12-23
  • 2021-11-11
  • 2021-12-20
  • 2022-12-23
  • 2021-10-24
  • 2021-12-13
  • 2021-11-21
相关资源
相似解决方案