`

java动态跟踪分析工具BTrace实现原理

    博客分类:
  • Java
 
阅读更多

转自:http://kenwublog.com/btrace-theory-analysis

 

 

今天,Team Leader推荐了一个非常棒的动态跟踪分析工具 – BTrace。由于对它的实现原理非常感兴趣,于是花了点时间研究了一下,顺便写点心得。

什么是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

转载请注明原文链接:http://kenwublog.com/btrace-theory-analysis


 

 

分享到:
评论

相关推荐

    BTrace实现原理

    BTrace,一个强大的Java诊断工具,其主要功能是在线无侵入地对生产环境中的Java应用程序进行动态跟踪和性能分析。它的实现原理主要依赖于四个核心组件:Java Agent、ASM、Java Instrument API以及Java Compiler API...

    BTrace-一个用于Java平台的安全动态的跟踪工具

    标题中的"BTrace"是一个专为Java平台设计的安全、动态的跟踪工具,它的主要功能是对正在运行的Java应用程序进行实时监控和诊断。BTrace利用了字节码注入的技术,能够在不修改原有代码的情况下,动态地向目标应用添加...

    性能工具之Java调试工具BTrace入门(csdn)————程序.pdf

    【Java调试工具BTrace入门】 在Java开发过程中,遇到应用程序性能问题或需要进行问题定位时,通常会依赖日志分析、远程调试等方法。然而,这些方法可能存在局限性,如日志信息不足、远程调试影响服务运行、频繁修改...

    btrace调试工具

    BTrace是一款强大的Java应用程序动态跟踪工具,它允许开发者在不修改源代码或重新启动应用的情况下,对正在运行的Java应用程序进行实时的性能分析和诊断。这款工具的核心在于其字节码注入技术,它能够动态地在类的...

    Btrace资源

    Btrace 是一个强大的Java应用程序动态跟踪工具,它允许开发者在不修改代码的情况下,对正在运行的应用程序进行实时监控和诊断。这个资源包包含了Btrace的多个组件,下面我们将逐一介绍。 1. **btracec.bat 和 ...

    btrace1.3.9

    【标题】"btrace1.3.9"指的是BTrace工具的一个特定版本,1.3.9,这是一款强大的Java应用程序动态跟踪工具。BTrace利用Java的JVMTI(Java Virtual Machine Tool Interface)和Serviceability Agent(SA)来提供安全、...

    btrace workbench

    BTrace(Business Trace)是一种动态跟踪工具,允许开发者在运行时对Java应用程序进行无侵入式的监控和诊断。BTrace Workbench则是BTrace的集成环境,它扩展了jvisualvm的功能,让开发者能够更方便地创建、调试和...

    btrace引导文件安装Btrace

    Btrace作为一个强大的Java应用监控工具,通过动态字节码注入技术,让我们无需修改代码就能实现运行时监控。结合VisualVM插件,我们可以更直观地管理和分析监控数据,这对于调试、性能优化以及问题排查具有极大的价值...

    btrace.jar

    【btrace.jar】是一款强大的Java在线诊断工具,它允许开发者在不重启应用程序的情况下,实时地对Java程序进行动态追踪和分析。这个工具的核心价值在于它能够帮助我们在生产环境中无侵入地解决性能问题或者追踪特定的...

    BTrace自我总结测试代码

    BTrace 是一个强大的、安全的、动态的Java应用程序诊断工具,由Sun Microsystems(现已被Oracle收购)开发。它允许开发者在运行时对应用程序进行探查,而无需修改源代码或重启服务。BTrace 使用Java Agent技术,通过...

    btrace源代码

    BTrace,全称为"Berkeley Trace",是一款强大的、动态的、安全的Java生产环境诊断工具。它允许开发者在运行时对Java应用程序进行性能分析和故障排查,而无需修改或重启应用。BTrace通过其独特的字节码注入技术,为...

    BTrace测试

    BTrace是Sun Microsystems开发的一款强大的动态跟踪工具,它允许开发者在不修改生产代码的情况下,对Java应用程序进行诊断和性能监控。BTrace的全称是"Berkeley Trace",它基于字节码注入技术,可以实时地、安全地在...

    btrace支持jdk1.6上运行的版本

    BTrace 是一个强大的动态代码跟踪工具,它允许开发者在运行时对Java应用程序进行安全的、低开销的、无侵入性的性能和行为分析。这个工具的独特之处在于,它不需要修改或重新编译源代码,而是通过向已运行的应用程序...

    Btrace 学习1

    BTrace 是一款强大的动态跟踪工具,它允许开发者在运行时对 Java 应用程序进行安全、低开销的诊断和性能分析。BTrace 基于 Sun/Oracle 的 Jitrino.JIT 和 Dynamic Code Enhancement 技术,可以实时地向已运行的应用...

    VisualVM--BTrace插件所需文件

    BTrace是VisualVM的一个插件,它提供了一种安全、动态的方式,用于在生产环境中对正在运行的Java应用程序进行代码跟踪和诊断,而无需重新编译或重启应用。这个压缩包文件"VisualVM--BTrace"很可能包含了安装和使用...

    BTrace二三事之二:OnMethod子类匹配BUG(怀疑)

    在IT行业中,BTrace是一个非常实用的工具,它主要用于Java应用程序的动态跟踪和诊断。本文将深入探讨“BTrace二三事之二:OnMethod子类匹配BUG(怀疑)”这一主题,结合源码分析和实际工具应用,揭示可能存在的问题...

    Java工程师成神之路~-HollisChuang's Blog1

    在Java工具的使用上,BTrace和TProfiler等工具提供了强大的动态跟踪和分析功能。JMX(Java Management Extensions)则允许远程监控和管理Java应用程序,这对于系统的运维和故障排查非常有用。同时,学习编写各种模拟...

Global site tag (gtag.js) - Google Analytics