什么是BTrace?
BTrace是SUN Kenai云计算开发平台下的一个开源项目。旨在为java提供安全可靠的动态跟踪分析工具。
Btrace基于动态字节码修改技术(Hotswap)来实现运行时java程序的跟踪和替换。(还记得javarebel不?)
Btrace的脚本是用纯java编写的,基于一套官方提供的annotation,使跟踪逻辑实现起来异常简单。
实现原理
用一个简单的公式来表述(从左往右的使用顺序):
Sun Attach API + BTrace脚本解析引擎 + Objectweb ASM + JDK6 Instumentation
1,Sun Attach API是充当动态加载 agent 的角色。
看下面的例子:
VirtualMachine vm = VirtualMachine.attach("1688"); // 1688是进程id String agentJarPath = "E:\\agent.jar"; // agent jar路径 vm.loadAgent(agentJarPath); // 加载agent
这个例子动态地为一个已经启动的java附加一个agent上去.
2,BTrace解析引擎解析BTrace脚本。
摘自官方的一个例子:
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class HelloWorld { @OnMethod( clazz="java.lang.Thread", method="start" ) public static void func() { println("about to start a thread!"); } }
@OnMethod告诉Btrace解析引擎需要代理的类和方法。
这个例子的作用是当java.lang.Thread类的任意一个对象调用 start 方法后,会调用 func 方法。
3,解析完脚本后,Btrace会使用ASM将脚本里标注的类java.lang.Thread的字节码重写,植入跟踪代码或新的逻辑。
在上面那个例子中,Java.lang.Thread 这个类的字节码被重写了。并在start方法体尾部植入了 func 方法的调用.
ASM的使用,本文不做延伸。
4,利用instrumentation的retransformClasses,将原始字节码替换掉。
instrumentation例子:
import java.lang.instrument.ClassDefinition; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; public class AgentMain { public static void agentmain(String agentArgs, Instrumentation inst) throws ClassNotFoundException, UnmodifiableClassException, InterruptedException { inst.addTransformer(new ClassFileTransformer() { public byte[] transform(ClassLoader l, String className, Class c, ProtectionDomain pd, byte[] b) throws IllegalClassFormatException { // BTrace解析脚本,利用asm重写bytecode,然后classLoader加载 } }, true); inst.retransformClasses(java.lang.Thread.class); } }
关于instrumentation的一些猜测
因为 instrumentation 不能添加,修改方法,字段名,所以我怀疑它的实现原理是用 JIT 生成机器码,利用机器码的优先执行来做class替换的。JIT本身会将调用次数频繁的方法编译成机器码。
还有一种猜测就是,备份堆里的老bytecode,然后直接替换为新的。不过这种方式貌似有点暴力。
另外,替换后的字节码是在新线程内才会生效的,老线程依旧用老的字节码在执行。
替换的类原有的字段值是保持不变的。
局限性
can not create new objects.
can not create new arrays.
can not throw exceptions.
can not catch exceptions.
can not make arbitrary instance or static method calls – only the public static methods of com.sun.btrace.BTraceUtils class may be called from a BTrace program.
can not assign to static or instance fields of target program’s classes and objects. But, BTrace class can assign to it’s own static fields (”trace state” can be mutated).
can not have instance fields and methods. Only static public void returning methods are allowed for a BTrace class. And all fields have to be static.
can not have outer, inner, nested or local classes.
can not have synchronized blocks or synchronized methods.
can not have loops (for, while, do..while)
can not extend arbitrary class (super class has to be java.lang.Object)
can not implement interfaces.
can not contains assert statements.
can not use class literals.
上面是摘自官方的使用限制列表,从内容上可以看,BTrace的神通仅仅局限于只读操作。不仅强制要求java脚本需要提供public static方法.
而且,脚本里无法实例化对象,数组,不能抛异常或捕捉,不能有循环,内部类等等。
针对一些特殊对象,BTrace也是无能为力的。比如java.lang.Integer,Array等。
不过话说回来,BTrace应付大部分应用场景还是绰绰有余的。
打破局限性约束
1,自己做instrumentation的类替换,绕过BTrace的安全检查。
2,基于JVM TI自己写工具,上面的局限性将荡然无存,并且可以实现的功能会多很多。
参考资料:
BTrace 用户指南 http://kenai.com/projects/btrace/pages/UserGuide
BTrace 开发者指南 http://kenai.com/projects/btrace/pages/DeveloperGuide
Instrumentation文档http://java.sun.com/javase/6/docs/technotes/guides/instrumentation/index.html
Attach API 文档http://java.sun.com/javase/6/docs/technotes/guides/attach/index.html
相关推荐
【BTrace实现原理详解】 BTrace,一个强大的Java诊断工具,其主要功能是在线无侵入地对生产环境中的Java应用程序进行动态跟踪和性能分析。它的实现原理主要依赖于四个核心组件:Java Agent、ASM、Java Instrument ...
Btrace通过分析和修改类文件,实现在运行时动态插入监控代码,而无需重新编译或重启应用。 **使用场景** Btrace 可用于多种场景,包括但不限于: 1. 性能瓶颈分析:实时追踪方法调用,找出耗时较长的操作。 2. 错误...
它的核心原理是通过ASM库来生成字节码,实现在目标类的方法中插入监控代码,以收集运行时数据。 二、BTrace 1.3.9与JDK 1.8兼容性 BTrace 1.3.9版本针对JDK 1.8进行了深度适配,确保在Java 8环境下依然能稳定高效...
BTrace的工作原理是基于字节码级别的跟踪,它在JVM启动时作为一个代理,动态地插入到目标应用的字节码中,当程序执行到特定点时,插入的追踪代码就会被执行,从而收集到相应的运行时数据。这种技术避免了对原始代码...
总结,BTrace作为一款强大的Java在线调试工具,通过字节码增强技术实现了对运行中的Java应用的实时监控,对于开发人员而言,是进行性能优化和问题排查的得力助手。合理运用BTrace,可以极大地提升线上问题解决的效率...
首先,你需要了解的是BTrace的工作原理。BTrace会动态地生成和注入字节码到目标Java类的方法中,以此来添加监控逻辑。这些监控脚本通常写在`.btrace`文件中,使用BTrace特定的脚本语言。例如,`BtraceTest.java`可能...
Btrace作为一个强大的Java应用监控工具,通过动态字节码注入技术,让我们无需修改代码就能实现运行时监控。结合VisualVM插件,我们可以更直观地管理和分析监控数据,这对于调试、性能优化以及问题排查具有极大的价值...
BTrace 通过动态字节码增强来实现监控。它使用`com.sun.btrace.BTraceAnnotations`中的注解来标记要执行的脚本。这些注解定义了何时和如何执行探查点,比如`@OnMethod`用于指定在哪个方法执行探查,`@Probe`用于...
总结起来,BTrace是一个强大且灵活的Java应用诊断工具,通过编写简单的Groovy脚本,就能实现在运行时对Java应用程序的深度监控。在开发和运维过程中,熟练掌握BTrace可以帮助我们快速定位问题,优化系统性能。在进行...
**一、BTrace 的工作原理** BTrace 使用 Java Agent 技术,它可以在不改变原有代码的情况下,利用 JVMTI(Java Virtual Machine Tool Interface)接口向运行中的 JVM 注入字节码。BTrace 提供了一种声明式的脚本...
本文将基于提供的"Btrace源代码"进行深入探讨,揭示BTrace的工作原理与核心机制。 首先,我们关注的是"Btrace~hg"这个文件,这很可能是BTrace项目使用Mercurial(Hg)版本控制系统保存的源代码库。Mercurial是一种...
BTrace通过字节码注入技术实现其功能。它会在类加载时动态修改类的字节码,插入追踪代码,而无需修改原有源代码。这使得BTrace成为一种非常灵活的诊断工具,尤其适合生产环境,因为它不会影响程序的正常执行流程。 ...
本文将深入探讨“BTrace二三事之二:OnMethod子类匹配BUG(怀疑)”这一主题,结合源码分析和实际工具应用,揭示可能存在的问题及其解决策略。 首先,我们要理解BTrace的工作原理。BTrace是基于字节码注入的技术,它...
BTrace 利用这个机制,通过 Dynamic Code Enhancement 动态地向运行的 JVM 注入新的字节码,实现对目标类的增强。 4. **BTrace API**: BTrace 提供了一系列的内建脚本函数和注解,如 @OnMethod、@Trace、@BTrace...
- `README.md`、`CHANGELOG.md`等文件提供了BTrace的详细使用指南、版本变更记录,有助于理解其工作原理和更新内容。 - `LICENSE`文件描述了BTrace的开源协议,遵守规定可以自由地使用和分发该工具。 - `LICENSE-3RD...
2. **工作原理**:BTrace通过Java Agent机制,在JVM启动时动态地将BTrace脚本插入到目标应用中,然后在特定的触发条件(如方法调用、特定类加载等)下执行这些脚本。 3. **BTrace脚本**:BTrace使用一种类似于Java...
由于BTrace使用的是字节码级别的修改,因此它能够在运行时实现对Java应用程序的监控,而无需重启服务。 **安装配置和注意事项** 安装BTrace通常只需下载官方仓库(https://github.com/btraceio/btrace)提供的版本...