BTrace的注解

BTrace是Java平台很强大的动态追踪工具,主要通过写BTrace脚本来实现,其主要功能是通过注解来实现的,这篇文章列出主要的一些注解。

方法注解

@OnMethod

@OnMethod注解用于指定目标类,目标方法和方法内部的位置。

1
@OnMethod(clazz=<cname_spec>[,method=<mname_spec>]? [,type=<signature>]? [,location=<location_spec>]?)

  • cname_spec = <class_name> | + <class_name> |/regex/
  • class_name 是类的全名(fully qualified class name)
  • +class_name指的是在类的全名之前加上符号+,表示该类的所有的子类和实现类
  • /regex/表示用正则表达式来过滤类名
  • mname_spec = <method_name> | /regex/
  • method_name是简单方法名,不包括签名和返回值
  • signature=<return_type>((arg_type(,arg_type)*)?)
  • return_type是方法的返回类型,eg. void,java.lang.String
  • arg_type是java的参数类型

@OnMethod注解的方法在给定的方法指定到指定的地方的时候会被调用。在OnMethod注解中,类名用clazz属性来指定,方法用method来指定。clazz属性可以类的全名(包含包路径,如,java.awt.Component)或者用正则表达式。正则表达式可以匹配0个或者多个类,被匹配的类都会被注入。例如/java.awt..+/会匹配java.awt.包下的所有类。同样的,方法名也可以用正则表达式匹配0个或者多个方法。

还可以通过指定注解的方法来指定要追踪的类和方法。BTrace会去匹配加了指定的注解的类或者方法。例如,如果clazz指定的是@javax.jws.WebService, BTrace会追踪所有的被WebService注解的类。类似的,方法也可以通过指定注解的方式来匹配。同样,也可以用正则表达式的方式来指定注解,比如@/com\.acme\..+/会匹配所有用了符合正则表达式的注解的类。

也可以通过指定超类的方法来匹配多个类。例如,如果要匹配所有Runnable的子类,可以指定+java.lang.Runnable

OnTimer

用来指定周期执行的追踪方法,单位是毫秒。

1
@OnTimer([[value=]?<value>]?)

  • value指定时间。

@OnError

加了该注解的方法在同一个BTrace类中其他追踪方法有异常抛出的时候运行。

@OnExit

当BTrace代码调用exit(int)的时候,被@OnExit注解的方法会被调用。

@OnEvent

用来和BTrace客户端发送的“外部”事件关联。

1
@OnEvent([[value=]?<event_name>]?)

  • event_name: 该事件handler将要响应的事件名称

加了@OnEvent注解的方法会在客户端发送了事件的时候被调用。客户端可能根据用户的请求(比如按了Ctr-C或者GUI按钮)来放松事件。一般使用一个String来表示事件的名字。该方式可以用来追踪外部触发的事件。

@OnLowMemory

用来追踪内存使用超过阈值的事件。

@OnProbe

用来使用外部文件定义追踪的类,方法和位置。

1
@OnProbe(namespace=<namespace_name>, name=<probe_name>)

  • namespace_name,任意java包路径
  • probe_name, probe的名字

@OnProbe定义的规范可以映射成一个或者多个@OnMethod注解。这个映射关系是用XML probe descriptor来定义的。

@Sampled

允许对被注解的方法进行艾洋。需要和@OnMethod注解一起使用。

1
@Samoled([kind=<sample_kind>[,mean=<numnber>])

  • <sampler_kind>只能是Sampler.Const, Sampler.AdaptiveSampler.None中的一个。

参数注解

@ProbeClassName

只能用于被@OnMethod注解了的方法上,用传递当前注入的类的名字。

@ProbeMethodName

同样,只能和@OnMethod注解一起使用。用来表示当前注入的方法的名字。

1
@ProbeMethodName([fqn=(true|false]?)

  • fqn: 是否使用Full Qualified Name。默认是false、

@Self

表示访问当前被拦截的方法的实例,即调用对象。

@Return

当前拦截的方法的返回值。必须和location=@Location(Kind.RETURN)一起用,且许保证拦截的方法返回非空(no-void)值。

@Duration

表示方法的执行时长。必须和location=@Location(Kind.RETURN)一起用,且必须是long型。

@TargetInstance

表示当前被拦截的方法调用在哪个实例上。和@Self类似。比如,当前拦截的方法的调用栈是instanceA.instanceB.get(), 那么@Self指的是instanceA,@TargeInstance则指的是instanceB。必须和location=@Location([Kind.CALL|Kind.FIELD_GET|Kind.FIELD_SET])一起用,且拦截的不是静态调用。

@TargetMethodOrField

表示当前被拦截的方法或者域的名字,和@ProbeMethodName类似。必须和location=@Location([Kind.CALL|Kind.FIELD_GET|Kind.FIELD_SET)一起使用。

1
@TargetMethodOrField([fqn=(true|false)]?)

  • fqn表示是否使用Full Quaified Name
BTrace的一些限制 更多运行JFR的方式

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×