BTrace分析和使用

article/2025/10/21 14:41:59

BTrace分析和使用

一、   BTrace简介

BTrace是一个为Java平台开发的安全、动态的追踪工具。BTrace动态地向目标应用程序的字节码注入Java追踪代码(字节码追踪)。

GitHUB地址https://github.com/btraceio/btrace

原理为将字节码发送到应用,并通过Instrumentation使用asm修改对应的应用class字节码,注入特定逻辑。

二、   对应用影响

影响仅在于应用内部会加载BTrace类,拦截的class会稍变化。

BTrace启动后,会对拦截的class进行字节码修改,但由于BTrace的主旨在于readonly,所以不会对class生成对象的内部状态做出更改,而且,BTrace退出后,Action不会被执行。

三、   解决的问题

特色功能为动态增加拦截处理器字节码到JVM,监控方法的调用和被调用,其中包括普通方法调用,以及构造方法调用。

非特色功能包括定时任务、随时打印线程堆栈、查看某个对象锁持有状态、某个线程状态、jvm参数、堆dump、即时检测死锁、显示内存占用等等jvisualvm包括的技术,因为其实现的方式类似。

四、   不能做的事情

Ø 不能新建类、新建数组、 抛异常、 捕获异常,

Ø 不能调用实例方法以及静态方法(com.sun.btrace.BTraceUtils除外)

Ø 不能将目标程序和对象赋值给BTrace的实例和静态field

Ø 不能定义外部、 内部、匿名、本地类、不能实现接口、 不能扩展类

Ø 不能有同步块和方法

Ø 不能有循环

Ø 不能使用assert语句

Ø 不能使用class字面值

为了保证trace语句只读, BTracetrace脚本有一些限制(比如不能改变被trace代码中的状态),这些限制同时也保证了可以放心使用Btrace,而无需担心影响应用内部状态。

五、   实例

@BTrace

public class ArgumentsAction {

       @Export

private static int count = 0;

private static Map<String,

String> history = Collections.newWeakMap();

       @OnMethod(clazz = "/btrace\\.sub\\..*/", method = "/.*/", location = @Location(value = Kind.CALL, clazz = "/.*/", method = "/.*/"), enableAt = @Level("=0"))

       public static void on(@Self Object self, @TargetInstance Object instance, @ProbeClassName String tar,

                      @ProbeMethodName String pmn, AnyType[] args) {

              BTraceUtils.printArray(args);

              Collections.put(history, tar, pmn);

       }

       @OnTimer(1000)

       public static void print() {

              BTraceUtils.println(Collections.size(history));

       }

       @OnEvent("l0")

       public static void event() {

              BTraceUtils.setInstrumentationLevel(0);

       }

}


运行参数btrace <pid> ArgumentsAction.java

此实例已经几乎包含所有知识点,具体包含以下几点:

Ø @BTrace@Export@OnMethod,即Class注解、字段注解、方法注解;

Ø Collections.newWeakMap()创建及使用Map只能通过BTraceUtils内部类操作;

Ø @Self@TargetInstanceAnyType,可以获取调用对象、被调用对象、参数;

Ø BTraceUtils.print等工具方法,输出信息只可以通过BTraceUtils提供的工具方法;

Ø @OnTimer定时器,创建定时任务;

Ø @OnEvent接收Btrace应用的事件(通过按下Ctrlc);

六、   使用详解

首先带来三个概念,完全可以按照Aop的思想理解。

Probe Point :在何处执行trace语句这里的"何处"可以是具体的跟踪地点和执行事件BTrace中通过各种注解来指定;

Trace Actions or Actions :在何时执行trace语句;

Action Methods :定义在trace脚本中的trace语句具体来说就是脚本中的无返回值静态方法;

A)      @OnMethod,放在Action Method上,创建行动;

a)   class属性。拦截的对象的类名,可以为全类名,btrace.action.ArgumentAction;也可以为正则表达式,如/btrace\\.sub\\..*/,注意正则表达式必须写在//中;

b)   method属性。拦截对象的方法名称,参数同样如同class属性;

c)   type属性。如果拦截方法有重载,可以设置仅拦截特定重载方法。如type="void (int, int, java.net.InetAddress)";

d)   enableAt属性。此属性代表设置该Action执行等级,如同Log的日志等级。如设置为@Level(">2"),则通过BTraceUtils.setInstrumentationLevel(3)之后,此Action才会执行;

e)   location属性@Location;

f)   value属性包括为Kind枚举值。其中常用为ENTRY、CALL、CATCH,其他请查看com.sun.btrace.annotations.Kind注释,每个枚举值有其详细的使用方式;

g)   Where属性,如Kind.ARRAY_GET类型,其严格要求where必须为AFTER;

h)   class和method含义如同@OnMethod相同,但生效时机有时不同,如使用Kind.CALL时,此过滤主动调用的对象。

i)   field属性,是是用Kind. FIELD_GET和Kind. FIELD_SET时字段的名称;

j)   line属性,代表到达代码第几行触发;

B)      @OnEvent在客户端按下Ctrl+c;

1:exit#直接退出

2:send an event #触发无参数@OnEvent

3:send a named event #输入事件名,触发@OnEvent(“<event name>”)

C)      @OnTimer创建定时任务;

D)      @com.sun.btrace.annotations.OnError Action内部发生错误触发;

E)      @com.sun.btrace.annotations.OnExit Action内部调用BTraceUtils.exit调用触发;

F)      @com.sun.btrace.annotations.OnLowMemory内存低时触发;

G)      @Property创建属性为btrace.<field name>的MBean字段;

H)     @Export添加虚拟机字段,可以通过jstat -J-Djstat.showUnsupported=true -snap <pid>查看;

七、   Btrace内部使用简单分析;

使用技术包括asm、instrument、JVM TI(java tool api) 、Java Compiler Api ,简单流程图如下,其功能与jvisualvm方式类似,可以在JVM参数添加-verbose查看类加载过程。


 如果需要查看Btrace的debug信息,可以在修改btrace脚本,添加-Dcom.sun.btrace.debug=true。instrument即为javaagent,其可以直接修改字节码,这也是Btrace的必要技术,查看修改的类的dump文件可以添加参数-Dcom.sun.btrace.dumpClasses=true -Dcom.sun.btrace.dumpDir=path。

JVM TI是JPDA的一部分,而我们常用的jdi、jdwp则与JVM TI处于同一等级。在使用中会发现,可以多次修改Action,这就牵涉到热更新的一部分,与Eclipse实现热更新实现的方式在jvm内部处理是相同的,都是通过Instrumentation实现,而这种实现的方式在于,仅可以修改已存在的方法体。


http://chatgpt.dhexx.cn/article/kSplyZbd.shtml

相关文章

BTrace入门

BTrace入门 概念性的东西自行网上查阅吧。 安装 现在btrace项目已经迁移到了github上了。这点可以从官网&#xff08; https://kenai.com/projects/btrace/downloads/directory/releases/latest &#xff09;上看出。 点开这个链接就会跳转到btrace项目的github地址&#x…

(转)btrace使用

Btrace 是一个安全&#xff0c;可以动态跟踪 java 程序的一种工具。他的操作不会对原有 java 进程产生影响&#xff0c;不用关闭正在运行的 java 进程&#xff0c;也不会修改 java 进程中的逻辑和数据。因此&#xff0c;也就成为我们线上跟踪生产代码的有力工具! 之前 Btrace 只…

【性能跟踪】btrace学习二--btrace一个简单例子

btrace安装好了&#xff0c;就看一些语法吧。可以到btrace的官方帮助文档中去看&#xff0c;基本上就可以http://kenai.com/projects/btrace/pages/UserGuide 【注&#xff1a;你本地的jdk要是1.6及以上才行&#xff0c;1.5可是不支持的】 下面以一个例子来说明&#xff1a; 新…

btrace 开源!基于 Systrace 高性能 Trace 工具

介绍 btrace&#xff08;又名 RheaTrace&#xff09; 是抖音基础技术团队自研的一款高性能 Android Trace 工具&#xff0c;它基于 Systrace 实现&#xff0c;并针对 Systrace 不足之处加以改进&#xff0c;核心改进点如下。 效率提升&#xff1a;编译期间为 App 方法自动注入自…

BTrace简介与使用说明

目录 前言 简介 安装 下载BTrace 配置BTRACE_HOME BTrace使用 注意事项 BTrace注解 ProbeClassName ProbeMethodName Self Return Duration TargetInstance TargetMethodOrField OnMethod OnTimer OnError OnEvent 在jvisualvm中使用BTrace BTraceUtils方法介绍 前言 大家在…

Btrace使用入门

目录 1.什么是BTrace 2.BTrace使用场景 BTrace可以做什么&#xff1f; 3.使用限制 4.使用方法及样例 4.1使用方法 4.2使用样例 2.查看哪些方法调用了 System.gc() &#xff0c;调用栈是怎样的 3.打印某个类中某一方法的入参和返回值 5.拦截方法定义 定位方法 拦截时…

黄油刀ButterKnife的使用

1、ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象&#xff0c;有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作&#xff0c;目前使用很广。最重要的一点&#xff0c;使用ButterKnife对性能基本没有损失&am…

Butterknife——黄油刀的基本使用

平常我们在做项目的时候&#xff0c;不可避免地一定会用到findviewbyid()方法&#xff0c;写多了还是比较繁琐的。但是有个大神Jake Wharton开源了一个神奇的框架叫做ButterKnife,炒鸡好用 接下来是黄油刀的基本用法 &#xff1a; 首先配置编译环境&#xff1a; 1.在eclipse…

黄油刀的使用

Android studio添加的插件名称&#xff1a; File---setting---plugins 添加三方类库 App包下的gradle添加 implementation com.jakewharton:butterknife:5.1.1 Activity布局 Altinsert选择

黄油刀butterknife在Library上的使用(元素值必须为常量表达式)

相信大家都有使用butterknife来为代码节省时间&#xff0c;但是当把项目合并入其他项目&#xff0c;或者是作为一个Library依赖的时候会发现编译会报错。 控制台显示错误&#xff1a;元素值必须为常量表达式。为什么会这样&#xff1f;仔细查看发现在library中注解生成的R文件里…

黄油刀 butterKnife

黄油刀 butterKnife: 自动findViewByID&#xff08;&#xff09;&#xff0c;自动添加点击事件onClick(); 步骤&#xff1a; 1.引入依赖包 butterknife&#xff1a;8.4.0 jakewharton:butterknife:8.4.0 2.安装插件 Android ButterKnife Zelezny 3.配置build 1、工程的gradle文…

ButterKnife(黄油刀)基本使用与源码解析

前言 ButterKnife又称黄油刀&#xff0c;是一款快速绑定Android视图中字段和方法的注解框架&#xff0c;也是Android开发中比较常用的一款快速注解框架&#xff0c;通过ButterKnife的合理运用&#xff0c;我们可以避免重复地书写findViewById&#xff0c;在各种场合下快速地绑…

黄油刀使用方法

一.首先在最外层的build.gradle里面导入 dependencies中导入 classpath com.neenbedankt.gradle.plugins:android-apt:1.8 例&#xff1a; 二.在内层 build.gradle 里面导入 compile com.jakewharton:butterknife:8.4.0 annotationProcessorcom.jakewharton:butterknife-co…

一把好用的黄油刀——Butter Knife

一把好用的黄油刀——Butter Knife 下载JAR包之后需要进行简单的Eclipse配置 Introduction&#xff08;官方简介&#xff0c;稍后译&#xff09; Annotate fields with BindView and a view ID for Butter Knife to find and automatically cast the corresponding view…

Android神兵利器之黄油刀的使用(ButterKnife)

黄油刀的使用是非常简单的事情&#xff0c;下载的时候需要注意的有两步&#xff1a; 1.下载jar&#xff0c;而下载jar包则有两种方法&#xff1a; A&#xff1a; File->Project Structure->Dependencies->Library dependency 中直接搜索butterknife选择任意一个就可…

android[butterKnife(黄油刀)史诗详细使用方法]

butterKnife中文又名黄油刀&#xff0c;是一款Android视图的字段和方法绑定快速注解框架。 1.首先把查看方式改变成Android。 2.打开Gradle Scripts层下的build.radle注意括号内是module的文件。 3.将代码粘贴到如下位置。 implementation com.jakewharton:butterknife:10.2.3…

butterknife----黄油刀

Butter Knife&#xff0c;专门为Android View设计的绑定注解&#xff0c;专业解决各种findViewById。 简单使用&#xff1a; 添加依赖&#xff1a; Download dependencies { compile com.jakewharton:butterknife:8.8.1 annotationProcessor com.jakewharton:butterknife-com…

黄油刀使用方法(butterknife)

使用心得&#xff1a; 1.Activity ButterKnife.bind(this);必须在setContentView();之后&#xff0c;且父类bind绑定后&#xff0c;子类不需要再bind 2.Fragment ButterKnife.bind(this, mRootView); 3.属性布局不能用private or static 修饰&#xff0c;否则会报错 4.setConte…

Android:butterKnife(黄油刀的简单使用

butterKnife中文又名黄油刀&#xff0c;是一款Android视图的字段和方法绑定快速注解。 1.1首先把查看方式改变成Android。 implementation com.jakewharton:butterknife:10.2.3// 添加此依赖 annotationProcessor com.jakewharton:butterknife-compiler:10.2.3// 添加此规…

Android中ButterKnife(黄油刀)的详细使用

最近刚学会使用ButterKnife&#xff0c;真是超级好用&#xff0c;忍不住要分享给大家了。 写在前面&#xff1a;该文档使用7.0版本&#xff0c;8.0版本方法名有所改动&#xff0c;建议看官方文档&#xff0c;整体业务逻辑和原理没什么变动。 在android编程过程中&#xff0c;我…