Btrace示例
在这个示例中,我们将实现Btrace脚本跟踪一个成员变量的变化。
被跟踪类的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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示例和资料整理,转载请注明来源!