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 中例子。