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示例和资料整理,转载请注明来源!