Btrace是由Kenai开发的一个开源项目,是一种动态跟踪分析JAVA源代码的工具。它使用OjbectWeb ASM组件来完成字节码层面上的跟踪分析,帮助我们对运行时的JAVA程序分析,监控等操作
优点:
》无侵入性(只查看,不会修改)
》不修改应用任何应用数据
》限制跟踪行为,没能有循环
一、 Btrace 原理:
本地编写跟踪类,由Btrace 命令行执行即可。
1、本地编译跟踪类。
2、attach远程JVM PID,将class传过去。
3、通过脚本引擎及asm动态变更JVM中的字节码,将跟踪代码嵌入。
4、代码触发后,将结果返回本地输出。
1、首先下载Btrace包。我下载的是最新版本1.2.2,下载地址:http://kenai.com/projects/btrace/downloads/directory/releases/release-1.2.2
有多个版本供你选择(window、Linux 、MacOS)。本文以windows为例。
下载后得到的是一个btrace-bin.zip 压缩包。将其解压(注:目录里面最好不要有空格)
2、配置环境变量
在环境变量中配置BTRACE_HOME。在PATH中添加BIN目录的路径
BTRACE_HOME = D:\software\btrace-bin
path=$path$;D:\software\btrace-bin\bin
三、使用步骤
1、运行要测试的web程序,或者是运行java程序的 main函数
2、用jps获取当前进程pid
3、运行监控脚本,查看特定类的运行状况。
命令格式:btrace <pid> 脚本程序.java,
四、例子
1.、业务代码
Count.java
package test.btrace;
/**
* 类Counter.java的实现描述:TODO 类实现描述
*
* @author onlyone 2012-11-3 下午12:33:56
*/
public class Counter {
// 总数
private static int totalCount = 0;
public int add(int num) throws Exception {
totalCount += num;
return totalCount;
}
public int getNum() {
return totalCount;
}
}
CountMainTest.java
package test.btrace;
import java.util.Random;
/**
* 类CountMainTest.java的实现描述:TODO 类实现描述
*
* @author onlyone 2012-11-3 下午12:34:35
*/
public class CountMainTest {
public static void main(String[] args) throws Exception {
Random random = new Random();
// 计数器
Counter counter = new Counter();
while (true) {
// 每次增加随机值
counter.add(random.nextInt(100));
System.out.println(counter.getNum());
System.out.println("--------------------------");
Thread.sleep(1000);
}
}
}
2、btrace脚本
package test.btrace;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
/**
* 类TraceTest.java的实现描述:TODO 类实现描述
*
* @author onlyone 2012-11-3 下午12:35:28
*/
@BTrace
public class TraceTest {
@TLS
private static long startTime = 0;
/**
* 开始时间
*/
@OnMethod(clazz = "test.btrace.Counter", method = "add")
public static void startMethod() {
startTime = timeMillis();
}
/**
* 结束时间
*/
@OnMethod(clazz = "test.btrace.Counter", method = "add", location = @Location(Kind.RETURN))
public static void endMethod() {
println(strcat("the class method execute time=>", str(timeMillis() - startTime)));
println("-------------------------------------------");
}
/**
* 跟踪方法执行过程
*
* @param num
* @param result
*/
@OnMethod(clazz = "test.btrace.Counter", method = "add", location = @Location(Kind.RETURN))
public static void traceExecute(int num, @Return int result) {
println(strcat("parameter num: ", str(num)));
println(strcat("return value:", str(result)));
}
}
3.首先运行业务类,CountMainTest.java
然后进入btrace脚本类目录 D:\alibaba\application\work\memcached\src\test\btrace,执行脚本命令
控制台输出:
源代码:https://mymemcached-cookie.googlecode.com/svn/trunk
参考资料:http://mgoann.iteye.com/blog/1409667