BTrace注解详细介绍

时间:2014-12-11 22:19:14   收藏:0   阅读:633

BTrace(https://btrace.dev.java.net/) 是一个非常不错的java诊断工具, 最近试着用了一下, 文档比较少, 主要是看例子吧.  

BTrace 中的B表示bytecode, 表明它是在字节码层面上对代码进行trace 

用来在运行中的java类中注入trace代码, 并对运行中的目标程序进行热交换(hotswap) 

btrace还提供了VisualVM Plugin 以及Netbeans Plugin

 

术语 

Probe Point 

在何处执行trace语句, 这里的"何处"可以是具体的跟踪地点和执行事件, 在BTrace中通过各种注解来指定 

 

Trace Actions or Actions 

在何时执行trace语句 

 

Action Methods 

定义在trace脚本中的trace语句, 具体来说就是脚本中的无返回值静态方法(1.2之后可以是非静态方法) 

 

BTrace限制 

为了保证trace语句只读, BTrace对trace脚本有一些限制(比如不能改变被trace代码中的状态) 

·         BTrace class不能新建类, 新建数组, 抛异常, 捕获异常,

·         不能调用实例方法以及静态方法(com.sun.btrace.BTraceUtils除外)

·         不能将目标程序和对象赋值给BTrace的实例和静态field

·         不能定义外部, 内部, 匿名, 本地类

·         不能有同步块和方法

·         不能有循环

·         不能实现接口, 不能扩展类

·         不能使用assert语句, 不能使用class字面值

BTrace步骤 

1.取得目标java进程id(pid) 

2.编写BTrace脚本 

3.执行命令行:  btrace <pid> <自己定制的脚本> <输出文件>

eg:btrace 3045PrintExecuteTime.java > time.log 

 

完整的BTrace命令: 

引用

btrace [-I <include-path>] [-p <port>] [-cp <classpath>] <pid> <btrace-script> [<args>]

 

预编译BTrace脚本命令 

引用

btracec [-I <include-path>] [-cp <classpath>] [-d <directory>] <one-or-more-BTrace-.java-files>

 

参数和上面大同小异, btracec 是一个类似javac的程序, 使用该程序编译, 将根据BTrace的限制条件进行严格检查 

 

在目标程序中启动BTrace Agent 

这个主要针对需要在目标程序启动的时候就需要trace其行为的场景, 此时BTrace agent将与目标程序一起启动(前提是必须对BTrace脚本进行预编译) 

命令行: 

引用

java -javaagent:btrace-agent.jar=script=<pre-compiled-btrace-script1>[,<pre-compiled-btrace-script1>]* <MainClass> <AppArguments>

方法上的注解 

参数上的注解 

          o (since 1.2)可以通过注解的fqn boolean属性来表明是否要获取全限定方法名 

          o (since 1.2) 可通过注解的fqn boolean属性来表明是否要获取全限定方法名 

未被注解的方法参数 

未使用注解的方法参数一般都是用来做方法签名匹配用的, 他们一般和被trace方法中参数出现的顺序一致. 不过他们也可以与注解方法交错使用, 如果一个参数类型声明为*AnyType[]*, 则表明它按顺序"通吃"方法所有参数. 未注解方法需要与*Location*结合使用: 

属性上的注解 

类上的注解 

 

简单的小栗子,测试函数运行消耗时间:

 1 /**
 2  * 测试函数耗时
 3  * 
 4  */
 5 
 6 @BTrace
 7 public class TraceScript {
 8     @TLS
 9     private static long startTime = 0;
10 
11     @OnMethod(clazz = "com.feinno.btrace.demo.TestMain", method = "testMethod")
12     public static void startMethod() {
13         startTime = timeMillis();
14     }
15 
16     @OnMethod(clazz = "com.feinno.btrace.demo.TestMain", method = "testMethod", location = @Location(Kind.RETURN))
17     public static void func() {
18         print("method cost:");
19         print(timeMillis() - startTime);
20         println();
21         
22     }
23 
24 }

btrace执行效果如下:

 bubuko.com,布布扣

 

原文:http://www.cnblogs.com/remagon/p/4158555.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!