BTrace入门及使用实例

标签: btrace 实例 | 发表时间:2014-03-02 00:48 | 作者:marb
出处:http://www.iteye.com

介绍
Btrace (Byte Trace)是sun推出的一款java 动态、安全追踪(监控)工具,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。 
In a way, BTrace scripts are very similar to AOP's aspects, but can be attached to any existing Java code (or better, bytecode) at runtime and without any configuration or modification at development time.

 

运行环境搭建
Steps to run BTrace
1.下载[btrace|http://kenai.com/projects/btrace/downloads/directory/releases]包 并把btrace的命令放到path中
2. jps命令查出需要监控的jvm pid
3. 编写BTrace程序 (安装包中带有大量的例子)
4. Run btrace tool by the following command line:
       btrace <pid> <btrace-script>


BTrace能作的事情

记录以下事件:
    * method calls;
    * execution times;
    * constructor invocation;
    * available memory;

触发脚本执行的场景:
Script execution is tied to several situations
    * reaching a specific line number;
    * invoking a given method;
    * returning from a method;
    * invoking system calls (e.g. exit);
    * recurring timer (period execution at fixed intervals);

 

BTrace不能作的事情
保证BTrace追踪的是只读操作,所以有一堆限制:
不仅强制要求java脚本需要提供public static方法.而且,脚本里无法实例化对象,数组,不能抛异常或捕捉,不能有循环,内部类等。
特别是不能调用任何的实例、静态方法,除了com.sun.btrace.BTraceUtils类static methods。*所以BTrace的功能全部在BTraceUtils中的方法。*


To guarantee that the tracing actions are "read-only" (i.e., the trace actions don't change the state of the program traced) and bounded (i.e., trace actions terminate in bounded time), a BTrace program is allowed to do only a restricted set of actions. In particular, a BTrace class

    * 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.

例子
监控某个方法的执行时间

 

Java代码   收藏代码
  1. <strong><em>import static com.sun.btrace.BTraceUtils.name;  
  2. import static com.sun.btrace.BTraceUtils.print;  
  3. import static com.sun.btrace.BTraceUtils.println;  
  4. import static com.sun.btrace.BTraceUtils.probeClass;  
  5. import static com.sun.btrace.BTraceUtils.probeMethod;  
  6. import static com.sun.btrace.BTraceUtils.str;  
  7. import static com.sun.btrace.BTraceUtils.strcat;  
  8. import static com.sun.btrace.BTraceUtils.timeMillis;  
  9.   
  10. import com.sun.btrace.annotations.BTrace;  
  11. import com.sun.btrace.annotations.Kind;  
  12. import com.sun.btrace.annotations.Location;  
  13. import com.sun.btrace.annotations.OnMethod;  
  14. import com.sun.btrace.annotations.TLS;  
  15.   
  16. /** 
  17.  * 监控方法耗时 
  18.  *  
  19.   */  
  20. @BTrace  
  21. public class PrintTimes {  
  22.   
  23.     /** 
  24.      * 开始时间 
  25.      */  
  26.     @TLS  
  27.     private static long startTime = 0;  
  28.   
  29.     /** 
  30.      * 方法开始时调用 
  31.      */  
  32.     @OnMethod(clazz = "/com\\.mike\\../", method = "/.+/")  
  33.     public static void startMethod() {  
  34.         startTime = timeMillis();  
  35.     }  
  36.   
  37.     /** 
  38.      * 方法结束时调用<br> 
  39.      * Kind.RETURN这个注解很重要 
  40.      */  
  41.     @SuppressWarnings("deprecation")  
  42.     @OnMethod(clazz = "/com\\.mike\\../", method = "/.+/", location = @Location(Kind.RETURN))  
  43.     public static void endMethod() {  
  44.   
  45.         print(strcat(strcat(name(probeClass()), "."), probeMethod()));  
  46.         print("  [");  
  47.         print(strcat("Time taken : ", str(timeMillis() - startTime)));  
  48.         println("]");  
  49.     }  
  50. }</em></strong>  

 

 

 

 

监控所有HTTP request请求的执行时间

 

Java代码   收藏代码
  1. @TLS  
  2. private static String invoke = "";  
  3.   
  4. @OnMethod(clazz = "javax.servlet.http.HttpServlet", method = "service", type = "void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)")  
  5. public static void start(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {  
  6.     invoke = concat(str(threadId(currentThread())), strcat("_", str(timeMillis())));  
  7.     print(invoke);  
  8.     print(" ");  
  9.     print(probeClass);  
  10.     print(" ");  
  11.     print(probeMethod);  
  12.     print(" s ");  
  13.     println(timeMillis());  
  14. }  
  15.   
  16. @OnMethod(clazz = "javax.servlet.http.HttpServlet", method = "service", type = "void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)", location = @Location(Kind.RETURN))  
  17. public static void end(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {  
  18.     print(invoke);  
  19.     print(" ");  
  20.     print(probeClass);  
  21.     print(" ");  
  22.     print(probeMethod);  
  23.     print(" e ");  
  24.     println(timeMillis());  
  25.     invoke = "";  
  26. }  

 

 

  监控所有HTTP request请求的具体java调用栈 call stack以及执行时间

 

在上面监控http request的基础上,增加你关心类的方法。然后通过ID(Thread ID, 时间戳)生成对应的调用图。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [btrace 实例] 推荐:

BTrace入门及使用实例

- - 互联网 - ITeye博客
Btrace (Byte Trace)是sun推出的一款java 动态、安全追踪(监控)工具,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源. 1.下载[btrace|http://kenai.com/projects/btrace/downloads/directory/releases]包 并把btrace的命令放到path中.

BTrace功能

- - zzm
       在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数、返回值、全局变量、堆栈信息等. 为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打印,再发布到生产环境. 通过这种方式,一方面将增大定位问题的成本和周期,对于紧急问题无法做到及时响应;另一方面重新部 署后环境可能已被破坏,很难重新问题的场景.

BTrace使用简介

- LightingMan - 淘宝JAVA中间件团队博客
BTrace通过动态的挂接用java写的代码到运行时上来获取到一些运行细节,例如典型的使用btrace的方法为:. btrace -cp [btrace的jar所在的路径,默认为btrace/build下] [pid] [需要运行的java代码]. 如在程序运行的情况下,想知道调用CaseObject的execute方法的以下几种情况,在BTrace中可以这么做:.

BTrace简单实用教程

- - ITeye博客
BTrace本身也是可以独立运行的程序,作用是在不停止目标程序运行的前提下,通过HotSpot虚拟机的HotSwap技术动态插入原本不存在的调试代码. 比如遇到了我们的程序出问题,而又没有足够的打印语句时,我们一般的方法是不得不停掉服务,然后修改代码,增加打印语句,重新编译重新运行来解决,效率很低.

HouseMD, 比BTrace更实用的Java运行诊断工具

- - ITeye博客
HouseMD 是一款非常敏捷的. Java进程运行时的诊断调式命令行工具, 它具备安全易用高效的特点, 让它非常适合在要求严格的线上(生产)环境中使用.. Tab自动补全或候选列表提示. SimpleName)和方法名(可选)限定跟踪目标. 支持根据抽象类或接口来限定其实现类的跟踪目标. 支持实时显示跟踪目标的摘要统计.

btrace拓展工具-java应用性能诊断优化利器

- - CSDN博客推荐文章
Btrace是一个实时监控工具,可以无需修改应用代码(事实上它修改了字节码),来达到不可告人的秘密. 它可以获取应用程序代码的执行时间,他可以让你无需修改代码,帮你做时间的打点. 但是,你需要编写btrace脚本,它是一个java文件. 在Eclipse中编写java类很简单,在linux上,vm不熟悉的可能就会比较痛苦了,并且脚本可复制性很强.

利用btrace在线监控java程序状态

- - CSDN博客研发管理推荐文章
      下载地址: https://kenai.com/projects/btrace/downloads/directory/releases/.       选择版本进行下载,这里下载的是 release-1.2.4 / btrace-bin.zip.       这两天在调试程序时,发现一个比较好用的工具-btrace,能够线上监控程序状态,获取运行时数据信息,如方法返回值,参数,调用次数,全局变量,调用堆栈等.

[原]BTrace介绍和生产环境例子

- - Vern的专栏
BTrace 是一个可靠的,用来动态跟踪Java程序的工具. 它通过动态对运行中的Java程序进行字节码生成来工作. BTrace会对运行中的Java程序的类插入一些跟踪操作 来对被跟踪的程序进行热替换. 探测点 (Probe Point). 就是一系列的跟踪语句被执行的“地方”或者“事件”. 探测点就是我们想要执行一些跟踪语句的地方或者事件.

Java程序排查问题利器之Btrace

- - ITeye博客
BTrace是Java的安全可靠的动态跟踪工具. 他的工作原理是通过 instrument + asm 来对正在运行的java程序中的class类进行动态增强,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源.