btrace 实践笔记

btrace简介:
    btrace 是一个使用在JAVA平台上面的,安全的,动态跟踪工具。它一般用于动态跟踪正在运行的jAVA程序。
    使用说明在这里。下载地址在这里
    下载的时候注意版本问题,我最初下载的是release-1.2.3的版本,然后服务器上面的JAVA的版本是1.6.0_32。运行的时候报了这个错。
[java] java.lang.UnsupportedClassVersionError[/java]
    这是由于编译release-1.2.3的jdk版本比1.6.0_32要高,但是却运行在较低版本的JVM上面,所以会报这个错,然后我下载了release-1.2.2版本没有这个问题。
 
btrace安装:
    btrace其实不需要安装,直接解压,然后把bin这个目录加到path里面,并且设置BTRACE_HOME为解压目录,然后就可以执行btrace命令测试了。
 
btrace实践步骤
首先找到运行中java程序的PID(后面会用到).
ps -A|grep java


然后
创建脚本:例如TraceObject.java
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
 
@BTrace public class TraceObject{
 
@TLS static long beginTime;
 
@OnMethod(
clazz="com.task.CheckTask",
method="getItem"
)
public static void traceBegin(){
beginTime = timeMillis();
}
 
@OnMethod(
clazz="com.task.CheckTask",
method="getItem",
location=@Location(Kind.RETURN)
)
public static void trace(long itemId,@Return Object result){
println("---------start-------------");
println(strcat("itemId:",str(itemId)));
println(strcat("result itemName:",str(get(field("com.info.ItemInfoDO","itemIdStr"),result))));
println(strcat(str(sizeof(result)),"bytes"));
println(strcat(strcat("execute time is:",str(timeMillis()-beginTime)),"ms"));
println("method stack:");
jstack();
println("---------end-------------");
}
}

   这个脚本主要的作用是监控CheckTask这个类的对象的getItem方法的入参是什么,返回值是什么,返回值占多少个字节(仅仅是该对象占的字节,不包括对象属性指向对象的大小)。以及这个方法的调用堆,以及这个方法的运行时间。

简单介绍下上面用到的几个注解:
@OnMethod 指定需要动态跟踪的类名和方法,其中的location属性表明是在方法执行前监控还是执行完之后监控,默认为执行方法前,如果需要执行完后监控使用location=@Location(Kind.RETURN)。
@TLS TLS用来指定Btrace的静态属性为线程本地属性。
另外trace方法的itemId为getItem方法的入参,result为getItem的返回值。
 
运行
  
sudo -u admin -H sh btrace 1671 TraceObject.java 

就能看到结果了。
 
 
当然btrace还有其他的用法。可以参照user guide 中例子。
 
资料:http://rdc.taobao.com/team/jm/archives/509 btrace使用简介
       https://kenai.com/projects/btrace/pages/UserGuide  userguide
原文地址:https://www.cnblogs.com/niurougan/p/4196031.html