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

标签: 利用 btrace 在线 | 发表时间:2014-03-02 01:25 | 作者:MINEZHANGHAO
出处:http://blog.csdn.net

btrace介绍

      下载地址: https://kenai.com/projects/btrace/downloads/directory/releases/

      选择版本进行下载,这里下载的是 release-1.2.4 / btrace-bin.zip

      这两天在调试程序时,发现一个比较好用的工具-btrace,能够线上监控程序状态,获取运行时数据信息,如方法返回值,参数,调用次数,全局变量,调用堆栈等。


btrace命令行使用

      位于bin目录下面主要有6个脚本,3个windows的,另外3个是linux的,分别是btrace、btracec、btracer。具体功能如下:

      1、btrace

功能: 用于运行BTrace跟踪程序。
命令格式:
         btrace [-I <include-path>] [-p <port>] [-cp <classpath>] <pid> <btrace-script> [<args>]
示例:
          btrace -cp build/  1200 AllCalls1.java
参数含义:
        include-path指定头文件的路径,用于脚本预处理功能,可选;
        port指定BTrace agent的服务端监听端口号,用来监听clients,默认为2020,可选;
        classpath用来指定类加载路径,默认为当前路径,可选; 
        pid表示进程号,可通过jps命令获取;
        btrace-script即为BTrace脚本;btrace脚本如果以.java结尾,会先编译再提交执行。可使用btracec命令对脚本进行预编译。
       args是BTrace脚本可选参数,在脚本中可通过"$"和"$length"获取参数信息。

     2. btracec


功能: 用于预编译BTrace脚本,用于在编译时期验证脚本正确性。
        btracec [-I <include-path>] [-cp <classpath>] [-d <directory>] <one-or-more-BTrace-.java-files>
参数意义同btrace命令一致,directory表示编译结果输出目录。

3. btracer 


功能: btracer命令同时启动应用程序和BTrace脚本,即在应用程序启动过程中使用BTrace脚本。而btrace命令针对已运行程序执行BTrace脚本。
命令格式:
       btracer <pre-compiled-btrace.class> <application-main-class> <application-args>
参数说明:
       pre-compiled-btrace.class表示经过btracec编译后的BTrace脚本。
       application-main-class表示应用程序代码; 
       application-args表示应用程序参数。 
       该命令的等价写法为: 
              java -javaagent:btrace-agent.jar=script=<pre-compiled-btrace-script1>[,<pre-compiled-btrace-script1>]*        <MainClass> <AppArguments>

 

btrace脚本限制

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.

 

 

jvisualvm 插件

BTrace提供了jvisualvm插件,强烈推荐在jvisualvm中编写和测试BTrace脚本,启动、关闭、发送事件、增加classpath都非常方便。


btrace实例

package baby.btrace;

public   class CaseObject{
     
       private static int sleepTotalTime=0; 
       private  int sleepTotalTime2=0; 
     
       public boolean execute(int sleepTime) throws Exception{
           System.out.println("sleep: "+sleepTime);
           sleepTotalTime+=sleepTime;
           sleepTotalTime2=sleepTotalTime+1;
          sleep(sleepTime);
           if(sleepTime%2==0)
               return true;
           else 
               return false;
       }

	 public void sleep(int sleepTime) throws Exception {   
        Thread.sleep(sleepTime);   
    }
     
    }


 

package baby.btrace;

import java.util.Random;

public class CaseObjectMain {
	int times = 10;

	public static void main(String[] args)  {
		CaseObjectMain main= new CaseObjectMain();
		try {
			main.begin();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void begin() throws Exception{
		
         CaseObject object=new CaseObject();
         while(true){
        	 times++;
             boolean result=doWork(object);
            Thread.sleep(1000);
         }
	}
	public boolean doWork(CaseObject object) throws Exception{
		 	Random random=new Random();
		
			boolean temp=	object.execute(random.nextInt(1000));
			return  temp;
	}

}


1、获取返回值,参数等信息

/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
    /* put your code here */
/*指明要查看的方法,类*/
  @OnMethod(
     clazz="baby.btrace.CaseObject",
     method="execute",
     location=@Location(Kind.RETURN)
  )
/*主要两个参数是对象自己的引用 和 返回值,其它参数都是方法调用时传入的参数*/
   public static void traceExecute(@Self baby.btrace.CaseObject object,int sleepTime, @Return boolean result){
      println("调用堆栈!!");
       println(strcat("返回结果是:",str(result)));
      jstack();
      println(strcat("时间是:",str(sleepTime)));
   }

}


2、获取对象属性值

/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
    /* put your code here */
/*指明要查看的方法,类*/
  @OnMethod(
     clazz="baby.btrace.CaseObject",
     method="execute",
     location=@Location(Kind.RETURN)
  )
/*主要两个参数是对象自己的引用 和 返回值,其它参数都是方法调用时传入的参数*/
   public static void traceExecute(@Self baby.btrace.CaseObject object,int sleepTime, @Return boolean result){
      println("调用堆栈!!");
       println(strcat("返回结果是:",str(result)));
      jstack();
      println(strcat("时间是:",str(sleepTime)));
   }

}


3、获取方法执行时长

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript3 {
   @TLS private static long startTime = 0;
   
   @OnMethod(
      clazz="baby.btrace.CaseObject",
      method="execute"
   ) 
   public static void startExecute(){
     startTime = timeNanos();
   } 
    
   @OnMethod(
      clazz="baby.btrace.CaseObject",
      method="execute",
      location=@Location(Kind.RETURN)
   ) 
   public static void endExecute(@Duration long duration){
     long time = timeNanos() - startTime;
     println(strcat("execute time(nanos): ", str(time)));
     println(strcat("duration(nanos): ", str(duration)));
   } 
}


4、正则匹配和获取方法执行次数

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript4 {
   private static long count; 
     
   @OnMethod(
      clazz="/.*/",
      method="execute",
      location=@Location(value=Kind.CALL, clazz="/.*/", method="sleep")
   )
   public static void traceExecute(@ProbeClassName String pcm, @ProbeMethodName String pmn,
   @TargetInstance Object instance,  @TargetMethodOrField String method){
     println("====== ");
     println(strcat("ProbeClassName: ",pcm));
     println(strcat("ProbeMethodName: ",pmn));
     println(strcat("TargetInstance: ",str(classOf(instance))));
     println(strcat("TargetMethodOrField : ",str(method)));
     count++;
   }
   
   @OnEvent
   public static void getCount(){
       println(strcat("count: ", str(count)));
   }
}


5、正则和事件交互

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript5 {
   private static long count; 
     
   @OnMethod(
      clazz="/.*/",
      method="execute",
      location=@Location(value=Kind.CALL, clazz="/.*/", method="sleep")
   )
   public static void traceExecute(@ProbeClassName String pcm, @ProbeMethodName String pmn,
   @TargetInstance Object instance,  @TargetMethodOrField String method){
     println("====== ");
     println(strcat("ProbeClassName: ",pcm));
     println(strcat("ProbeMethodName: ",pmn));
     println(strcat("TargetInstance: ",str(classOf(instance))));
     println(strcat("TargetMethodOrField : ",str(method)));
     count++;
   }
   
   @OnEvent
   public static void getCount(){
       println(strcat("count: ", str(count)));
   }
    @OnEvent("A")
   public static void getCountA(){
        println("==AAAA==== ");
       println(strcat("count: ", str(count)));
   }
    @OnEvent("B")
   public static void getCountB(){
        println("==BBB==== ");
       println(strcat("count: ", str(count)));
   }
}


 

链接:

http://agapple.iteye.com/blog/1005918

http://agapple.iteye.com/blog/962119

 

作者:MINEZHANGHAO 发表于2014-3-1 17:25:46 原文链接
阅读:75 评论:0 查看评论

相关 [利用 btrace 在线] 推荐:

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

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

BTrace功能

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

BTrace使用简介

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

BTrace简单实用教程

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

BTrace入门及使用实例

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

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

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

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

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

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

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

Java程序排查问题利器之Btrace

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