Btrace示例
在这个示例中,我们将实现Btrace脚本跟踪一个成员变量的变化。
被跟踪类的代码如下:
package com.bo56;
class Demo {
private static int counter;
public void add(){
try {
counter++;
System.out.println("bo56.com " + counter);
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e);
}
}
}
public class Test{
public static void main(String[] arg) {
Demo demo = new Demo();
for (int i = 0; i < 100; i++) {
demo.add();
}
}
}
我们要实现的跟踪目标是,每当demo.add调用完毕Return时,我们输出counter值。Btrace的代码如下:
package com.sun.btrace.samples;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class Canglong {
@OnMethod(
clazz="com.bo56.Demo",
method="add",
location=@Location(value=Kind.RETURN)
)
public static void monitor(@Self Object self, @ProbeMethodName String pmn){
Class clazz = Reflective.classOf(self);
int counter = getInt(field(clazz, "counter"), self);
println("counter value is " + counter);
}
}
上面的Reflective.classOf , field 等方法都是在包com.sun.btrace.BTraceUtils中。具体可以查看作者github源码。路径是 /src/share/classes/com/sun/btrace/BTraceUtils.java。
相关代码
代码的github地址
https://github.com/btraceio/btrace
com.sun.btrace.BTraceUtils工具类提供的所有方法
/src/share/classes/com/sun/btrace/BTraceUtils.java
Btrace实现代码监控增强处理的核心逻辑
里面也包含Location中每种Kind都接受那些参数。如多对btrace中对OnMethod的Location使用上,以及一些annotation使用不明确的,可以查看此文件。
/src/share/classes/com/sun/btrace/runtime/Instrumentor.java
所有示例代码
/samples/
/src/test/
相关资料
技术交流

原文链接:Btrace示例和资料整理,转载请注明来源!

