`
gaopengxiang417
  • 浏览: 21167 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

BTrace

阅读更多
很多时候在online的应用出现问题时,很多时候我们需要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中所有的运行细节都打印到日志上,通常这个时候能采取的就是修改代码,重新部署,然后再观察,但这种方法对于online应用来说不是很好,另外一方面如果碰到不好改的代码,例如引用的其他的外部的包什么的,就很麻烦了,BTrace就是一个可以在不改代码、不重启应用的情况下,动态的查看程序运行细节的工具,其官方网站在此:http://kenai.com/projects/btrace/ ,在这篇blog中,就来看看如何用BTrace来动态的监测方法的一些运行细节状况。
BTrace通过动态的挂接用java写的代码到运行时上来获取到一些运行细节,例如典型的使用btrace的方法为:
btrace -cp [btrace的jar所在的路径,默认为btrace/build下] [pid] [需要运行的java代码]
例如一段这样的代码:

import java.util.Random; 

public class Case1{ 

  

   public static void main(String[] args) throws Exception{ 

      Random random=new Random(); 

      CaseObject object=new CaseObject(); 

      boolean result=true; 

      while(result){ 

         result=object.execute(random.nextInt(1000)); 

         Thread.sleep(1000); 

      } 

   } 

  



public class CaseObject{ 

  

   private static int sleepTotalTime=0;   

  

   public boolean execute(int sleepTime) throws Exception{ 

       System.out.println("sleep: "+sleepTime); 

       sleepTotalTime+=sleepTime; 

       Thread.sleep(sleepTime); 

       return true; 

   } 

  

}

如在程序运行的情况下,想知道调用CaseObject的execute方法的以下几种情况,在BTrace中可以这么做:
1、调用此方法时传入的是什么参数,返回的是什么值,当时sleepTotalTime是多少?
BTrace脚本如下:

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

import com.sun.btrace.annotations.*; 

  

@BTrace public class TraceMethodArgsAndReturn{ 

   @OnMethod( 

      clazz="CaseObject", 

      method="execute", 

      location=@Location(Kind.RETURN) 

   ) 

   public static void traceExecute(@Self CaseObject instance,int sleepTime,@Return boolean result){ 

     println("call CaseObject.execute"); 

     println(strcat("sleepTime is:",str(sleepTime))); 

     println(strcat("sleepTotalTime is:",str(get(field("CaseObject","sleepTotalTime"),instance)))); 

     println(strcat("return value is:",str(result))); 

   } 

}

然后直接执行btrace -cp btrace/build [pid] TraceMethodArgsAndReturn.java就可以了。
当程序中调用到caseobject的execute方法时,就会在btrace的console中输出相应的信息。
2、execute方法执行耗时是多久?
BTrace脚本如下:

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

import com.sun.btrace.annotations.*; 

  

@BTrace public class TraceMethodExecuteTime{ 

  

   @TLS static long beginTime; 

  

   @OnMethod( 

      clazz="CaseObject", 

      method="execute"

   ) 

   public static void traceExecuteBegin(){ 

     beginTime=timeMillis(); 

   } 

  

   @OnMethod( 

      clazz="CaseObject", 

      method="execute", 

      location=@Location(Kind.RETURN) 

   ) 

   public static void traceExecute(int sleepTime,@Return boolean result){ 

      println(strcat(strcat("CaseObject.execute time is:",str(timeMillis()-beginTime)),"ms")); 

   } 

}

3、谁调用了execute方法?
BTrace脚本如下:

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

import com.sun.btrace.annotations.*; 

  

@BTrace public class TraceMethodCallee{ 

   @OnMethod( 

      clazz="CaseObject", 

      method="execute"

   ) 

   public static void traceExecute(){ 

     println("who call CaseObject.execute :"); 

     jstack(); 

   } 

}

4、有没有人调用CaseObject中的哪一行代码?
BTrace脚本如下:

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

import com.sun.btrace.annotations.*; 

  

@BTrace public class TraceMethodLine{ 

   @OnMethod( 

      clazz="CaseObject", 

      location=@Location(value=Kind.LINE,line=5) 

   ) 

   public static void traceExecute(@ProbeClassName String pcn,@ProbeMethodName String pmn,int line){ 

     println(strcat(strcat(strcat("call ",pcn),"."),pmn)); 

   } 

}

从上面可看出,在有了BTrace后,要动态的跟踪代码的运行细节还是非常爽的,更多的细节的操作请大家查看BTrace的User Guide。
分享到:
评论

相关推荐

    btrace扩展功能工具

    1.btrace扩展是在btrace已由功能上进行的扩展,原有功能和使用方式依然没变。目前版本扩展了两个功能:接口时间监控和接口时间调用树监控。扩展之后的btrace功能使用时都不需要写btrace脚本。 2.使用接口时间监控...

    btrace release-1.2.5.1

    btrace btrace btrace btrace

    jdk1.8-Btrace.rar

    java 在线检测插件Btrace, 无需重启服务,即可在线定位问题

    BTrace安装包 btrace-bin-1.3.11.3.zip + btrace-src-1.3.11.3.zip

    btrace-bin直接解压缩配置环境变量后即可运行使用。 java监控调试工具虚拟机监控程序,利用BTrace可以在线监控java程序状态。 BTrace是一种安全,动态的Java跟踪工具。BTrace通过动态(字节码)检测正在运行的Java...

    BTrace监控远程服务器使用实例

    自己做的BTrace监控,Linux服务器上的tomcat工程,压缩包包含BTrace开发所需的jar包 BTrace简单示例代码 jvisualvm.exe如果远程服务器监控JVM虚拟机信息

    btrace api 1.2.chm

    btrace api 1.2 文档,从网上扒下来自己做的,其他地方貌似都没有chm,提供给大家使用 btrace是一个跟踪、监控java程序的小工具,能够在不改变源代码的情况下监控很多东西,比如:方法运行时间、输入输出参数、抛出...

    btrace1.3.9.zip

    btrace1.3.9 jdk1.8 maven 编译构建 http://github.com/btraceio/btrace

    jvisualvm btrace插件离线安装

    jvisualvm btrace插件离线安装,如果jvisualvm不能安装btrace,则可进行离线安装。 这里收集了安装btrace所需要的依赖包,直接添加 即可安装

    jvisualvm-btrace离线安装包

    jvisualvm-btrace离线安装包。 jvisualvm btrace插件离线安装包1.2.85版本,目前官网不支持国内在线下载。 含相关依赖包:jsyntaxpane-lib.nbm、net-java-btrace-api.nbm、net-java-btrace-visualvm.nbm、...

    Btrace 官方zip包

    Btrace用来做项目检测,访问过的类方法统计,无侵略性,JDK1.6

    btrace-release-1.3.11.3.zip

    Btrace Java 发布版本,Java 虚拟机监控程序

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

    btrace支持jdk1.6上运行的版本,欢迎下载交流~

    BTrace自我总结测试代码

    BTrace自我学习测试代码总结,包含List对象参数,自定义对象的参数的监控。

    btrace支持jdk1.7 linux下使用

    btrace支持jdk1.7 linux下使用 非常好用哦 呵呵呵呵

    btrace-bin-1.3.11.zip

    btrace-bin-1.3.11.zip 目前最近的版本,java调度的绝对利器

    btrace-bin-1.3.9

    BTrace作为线上问题定位神器,它在侵入、安全、资源占用等方面表现的都非常出色。

    btrace-bin-1.3.9.tgz

    Java的安全动态追踪工具 BTrace通过运行Java程序的动态(字节码)工具类来工作。 BTrace将追踪操作插入正在运行的Java程序的类中,并将被追踪的程序类热插拔。

    btrace_extend-master

    btrace_extend-master,解压后上传至服务器即可以使用btrace命令

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

    BTrace可用于动态跟踪正在运行的Java程序(类似于DTrace for OpenSolaris应用程序)。 BTrace动态地测试目标应用程序的类以注入跟踪代码(“字节代码跟踪”)。

    btrace工具

    Btrace:java性能调优及问题追踪工具 Btrace:java性能调优及问题追踪工具

Global site tag (gtag.js) - Google Analytics