BTrace小结
之前很早有同事分享过Btrace的原理,基于java?Instruction?实现的,方便跟踪代码。对于线上应用,我们不能进行debug来获取运行的详细信息,通过BTrace可以搞定一些问题。Btrace使用到的技术主要有
?Java?Compiler?API?Annotation?Processing?Java?Agent?ASM?4?Attach?API?jvmstat?JMX
术语主要有三个:
Probe?Point?:在何处执行trace语句,?这里的"何处"可以是具体的跟踪地点和执行事件,?在BTrace中通过各种注解来指定?
Trace?Actions?or?Actions:在何时执行trace语句?
Action?Methods?:定义在trace脚本中的trace语句,?具体来说就是脚本中的无返回值静态方法(1.2之后可以是非静态方法)
使用BTrace
(1)下载BTrace的工程代码
mkdir?/home/admin/btrace
cd?/home/admin/btrace
wget??http://kenai.com/downloads/btrace/releases/release-1.2.2/btrace-bin.tar.gz?
tar?-xzvf??/home/admin/btrace/btrace-bin.tar.gz
export?JAVA_HOME=/java
(2)编写自定义的BTrace脚本(java文件)
常用的几个注解
A、方法上的注解OnMethod
clazz:?类名称,可以是全称,也可以是正则表达式(也可以是正则表达式(表达式必须写在"//"中,?比如"/java\\.awt\\..+/").)
例如:?clazz="+java.lang.ClassLoader"--》实现ClassLoader接口的类;
method:方法名称,
location:例如location=@Location(Kind.RETURN)是一个枚举值
例如:
?@OnMethod(
????????clazz="/java\\.io\\..*Input.*/",
????????method="/read.*/"
????)
B?、方法上的注解OnTimer?用来指定时长(ms)执行一次trace.?时长通过"value"属性指定。例如???@OnTimer(4000)?
C、?其他方法上的注解、
OnError?当trace代码抛异常时该注解的方法会被执行.?如果同一个trace脚本中其他方法抛异常,?该注解方法也会被执行.
OnExit?当trace方法调用内置exit(int)方法(用来结束整个trace程序)时,?该注解的方法会被执行.?参考自带例子ProbeExit.java.
OnEvent?用来截获"外部"btrace?client触发的事件,?比如按Ctrl-C?中断btrace执行时将执行使用了该注解的方法,?该注解的value值为具体事件名称.?
OnLowMemory?当内存超过某个设定值将触发该注解的方法,?具体参考MemAlerter.java
D、参数上的注解:Self?用来指定被trace方法的this
E、参数上的注解:Return?用来指定被trace方法的返回值
F、参数上的注解:ProbeClassName?和ProbeMethodName??被trace的类名称和方法名称
G、参数:.TargetInstance?(since?1.1)?用来指定被trace方法内部被调用到的实例
H、参数:TargetMethodOrField?(since?1.1)?用来指定被trace方法内部被调用的方法名,?可参考例子AllCalls1.java?合?AllCalls2.java
I、属性上的注解:TLS?将一个脚本变量与一个ThreadLocal变量关联
?
常用的几种脚本
A、查看一个方法的入参和返回值
B、查看一个方法执行耗时
C、谁调用这个方法
D、代码中的特定行有没有被调用
?
下面转自毕玄的博客:http://rdc.taobao.com/team/jm/archives/509
如一段这样的代码:
}?
?
参考:
http://rdc.taobao.com/team/jm/archives/509
?http://kenai.com/projects/btrace/?
http://macrochen.iteye.com/blog/838920
?
?
?