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; } }
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); } } }
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))); } }
然后进入btrace脚本类目录 D:\alibaba\application\work\memcached\src\test\btrace,执行脚本命令
控制台输出:
源代码:https://mymemcached-cookie.googlecode.com/svn/trunk
参考资料:http://mgoann.iteye.com/blog/1409667