Skip to the content.

xxd一个编译后的用于单元测试的class脚本就可以发现,这些脚本都是Btrace自己编译的,魔数位是0xbacecaca。因为在开发环境调试方便,我就直接用的com/sun/btrace/compiler/Compiler.java的main方法编译脚本了。

/home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/BTraceClassWriter.instrument –> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/InstrumentUtils.accept –> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/BTraceClassReader.accept
–> btrace-asm-5.2.jar!/com/sun/btrace/org/objectweb/asm/ClassReader.accept
–> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/BTraceClassReader.accept –> btrace-asm-5.2.jar!/com/sun/btrace/org/objectweb/asm/ClassReader.accept -> b
–> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/Instrumentor.visitMethod –> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/InstrumentingMethodVisitor.ctor -> initLocals [load被拦截方法参数类型,这里isInstance是true,加载的本地变量算上变量所有者owner(自身实例)=参数个数+1,但是argSize由于循环增加时对owner加了两次于是=参数个数+2]

«< Instrumentor.visitMethod : methodVisitor = new TemplateExpanderVisitor(methodVisitor, mHelper, className, name, desc); [ctor : this.expanders.add(new MethodTrackingExpander(MethodID.getMethodId(className, methodName, desc), mHelper)); this.asm = new Assembler(mv, mHelper);]     循环脚本(脚本参数中本来Throw我是放在被拦截参数前面的,编译后读出来就在后面了,这一点要确认下)的拦截方法 each -> instrumentorFor[这个方法比较重要,它根据location = @Location(Kind.?)创建处理对应情况的MethodVisitor(既然是循环,多个返回是如何处理的?)] «< Instrumentor.visitMethod [new一个MethodVisitor返回]:


    return new MethodVisitor(Opcodes.ASM5, methodVisitor) {
        @Override
        public AnnotationVisitor visitAnnotation(String annoDesc, boolean visible) {
            for (OnMethod om : annotationMatchers) {
                String extAnnoName = Type.getType(annoDesc).getClassName();
                String annoName = om.getMethod();
                if (om.isMethodRegexMatcher()) {
                    try {
                        if (extAnnoName.matches(annoName)) {
                            mv = instrumentorFor(om, mv, mHelper, mAccess, name, desc);
                        }
                    } catch (PatternSyntaxException pse) {
                        reportPatternSyntaxException(extAnnoName);
                    }
                } else if (annoName.equals(extAnnoName)) {
                    mv = instrumentorFor(om, mv, mHelper, mAccess, name, desc);
                }
            }
            return mv.visitAnnotation(annoDesc, visible);
        }
    };
}

–> btrace-asm-5.2.jar!/com/sun/btrace/org/objectweb/asm/ClassReader.accept -> b
–> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/instr/MethodInstrumentor.visitCode –> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/Instrumentor.visitMethodPrologue –> /home/aaa/Github/btrace/src/share/classes/com/sun/btrace/runtime/instr/ErrorReturnInstrumentor.visitMethodPrologue [因为我跑的这个是Error类型的] -> visitTryCatchBlock
—>

脚本被Btrace编译后读入:       File f = new File(path); InputStream is = new FileInputStream(f)

    while ((read = is.read(buffer)) > 0) {
        byte[] newresult = new byte[result.length + read];
        System.arraycopy(result, 0, newresult, 0, result.length);
        System.arraycopy(buffer, 0, newresult, result.length, read);
        result = newresult;
    }   这里的result做参数(traceData)来创建BTraceProbe :

    BTraceProbe bcn = factory.createProbe(traceData);

createProbe:

    int mgc = ((code[0] & 0xff) << 24) | ((code[1] & 0xff) << 16) | ((code[2] & 0xff) << 8) | (( & 0xff));

magic:class是一组以8位字节(byte)为基础单位的二进制流。在class文件开头的四个字节, 存放着class文件的魔数, 这个魔数是class文件的标志,他是一个固定的值: 0XCAFEBABE 。 也就是说他是判断一个文件是不是class格式的文件的标准, 如果开头四个字节不是0XCAFEBABE, 那么就说明它不是class文件, 不能被JVM识别。(可参考《深入理解Java虚拟机JVM高级特性与最佳实践》第六章)

这句代码是要将4个字节合成一个值与BTraceProbePersisted.MAGIC值进行比较。因为byte转为int,int会用32位中的低8位保存这个数,所以前3个字节分别进行了左位移。其中对每个字节和0xff的位与运算是因为:计算机中都是用的补码,因为计算机只能做加减运算,为了在运算中保持符号位的正确性所以使用的是补码。而这条语句一旦开始执行code[0]就会被表示为int类型,变为32位的,如果不做处理那么高的24位会补1导致补码值不正确,而先做&0xff运算,原来是0的还是0,是1的还是1,就保证了数据的正确性。(每个字节表示数的取值范围:因为-0的符号没有意义,所以符号位是1,其余都是0的补码可以用来表示-127-1,因为负数的补码符号位为1,其余位为该数绝对值的原码按位取反,然后加1)。code如果是我们自己编译的class文件读出来的byte数组,code[0] code[1] code[2] code[3]指的就是magic这4个字节。为什么要这么说呢,因为如果我们传给btrace的是个.java文件,它自己会进行编译,编译的class格式也是参照了虚拟机的格式,但是其中魔数用的是0xbacecaca,版本号用的是VERSION = 1,见BTraceProbePersisted.write(DataOutputStream dos)方法。

    $ xxd ArgsDurationErrAAA.class 
    00000000: bace caca 0000 0001 0022 7472 6163 6573 
    ...

利用BTraceProbePersisted.MAGIC验证了加载的文件是自己的脚本class文件后,用去掉了魔数后的byte数组创建BTraceProbePersisted对象。

    BTraceProbePersisted bpp = new BTraceProbePersisted(this);
            try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(Arrays.copyOfRange(code, 4, code.length)))) {
                bpp.read(dis);
                return bpp;

read验证了一下版本,如果通过,调用了read_1:

    private void read_1(DataInputStream dis) throws IOException {
            delegate.setClassName(dis.readUTF());
            readServices(dis);
            readOnMethods(dis);
            readOnProbes(dis);
            readCallees(dis);
            readDataHolderClass(dis);
            readFullData(dis);
    }

虽然这里不是遵守的java虚拟机的规范,但是方式是类似的,按着严格的顺序和紧凑的排列读取编译结果。

readUTF方法先读取流的下两个字节,转为一个无符号的16位整数,对应BTraceProbePersisted.write中写版本后的dos.writeUTF(getClassName(true)),上面xxd命令已经显示了这两个字节是0022, 2 * 16 + 2 = 34。读出来的值utflen为34,也就是说后面34个字节是BTraceProbeSupport.origName,如果类没有重命名className也是它。

    while (count < utflen) {
        c = (int) bytearr[count] & 0xff;
        if (c > 127) break;
        count++;
        chararr[chararr_count++]=(char)c;
    }

如果有出现c > 127的情况,下面还有一个循环处理。最后转成字符串返回,这个字符串就是类全路径名。

readInt读入下面4个字节,读取逻辑和刚才是一样的,我这里没有Field,所以是0000 0000:

    private void readServices(DataInputStream dis) throws IOException {
            int num = dis.readInt();
            for (int i = 0; i < num; i++) {
                delegate.addServiceField(dis.readUTF(), dis.readUTF());
            }
    }

readOnMethods:

        private void readOnMethods(DataInputStream dis) throws IOException {
            int num = dis.readInt();
            for (int i = 0; i < num; i++) {
                OnMethod om = new OnMethod();

接着的4个字节标识有多少个方法,依次处理每个方法,我这里是一个0000 0001,完整的xxd结果,贴在最后了:

            om.setClazz(dis.readUTF());                   设置被拦截的类,这里是正则形式,例如:/.*\.OnMethodTest/,0012表示长度
            om.setMethod(dis.readUTF());                  被拦截的方法,@OnMethod注解中method的值,例如:method=args的args;会判断是否正则,是否是注解; 0004 6172 6773;
            om.setExactTypeMatch(dis.readBoolean());      下一个byte转为boolean,我这里是00,所以是false
            bom.setTargetDescriptor(dis.readUTF());       参考xxd结果时可能要注意下,00和40分开了,长度64,内容是脚本方法的参数和返回值:(Ljava/lang/Throwable;Ljava/lang/String;J[Ljava/lang/String;[I)V  --> Throwable, String, long, String[], int[]
            om.setTargetName(dis.readUTF());              被标记了@OnMethod的脚本方法本身的方法名
            om.setType(dis.readUTF());                    0000
            om.setClassNameParameter(dis.readInt());      readInt4个255拼成-1
            om.setDurationParameter(dis.readInt());       
            om.setMethodParameter(dis.readInt());         
            om.setReturnParameter(dis.readInt());
            om.setSelfParameter(dis.readInt());
            om.setTargetInstanceParameter(dis.readInt());
            om.setTargetMethodOrFieldParameter(dis.readInt());
            om.setMethodFqn(dis.readBoolean());            我猜应该是方法完全限定名
            om.setTargetMethodOrFieldFqn(dis.readBoolean());
            om.setSamplerKind(Sampled.Sampler.valueOf(dis.readUTF()));      
            om.setSamplerMean(dis.readInt());
            om.setLevel(dis.readBoolean() ? Level.fromString(dis.readUTF()) : null);

            Location loc = new Location();
            loc.setValue(Kind.valueOf(dis.readUTF()));      默认值Kind.ENTRY,这里是ERROR
            loc.setWhere(Where.valueOf(dis.readUTF()));     BEFORE
            loc.setClazz(dis.readBoolean() ? dis.readUTF() : null);
            loc.setField(dis.readBoolean() ? dis.readUTF() : null);
            loc.setMethod(dis.readBoolean() ? dis.readUTF() : null);
            loc.setType(dis.readBoolean() ? dis.readUTF() : null);
            loc.setLine(dis.readInt());

之后还有readDataHolderClass和readFullData等几个方法,逻辑类似,总之就是把用BTrace自己规则编译的脚本文件读进内存,保存在BTraceProbePersisted对象的实例中。

data的大概内容:

            public class traces/onmethod/ArgsDurationErrAAA {


              @Lcom/sun/btrace/annotations/BTrace;()

              // access flags 0x9
              public static Lcom/sun/btrace/BTraceRuntime; runtime

              // access flags 0x49
              public static volatile I $btrace$$level = 0

              // access flags 0x9
              public static <clinit>()V
                TRYCATCHBLOCK L0 L1 L1 java/lang/Throwable
               L0
                LDC Ltraces/onmethod/ArgsDurationErrAAA;.class
                ACONST_NULL
                ACONST_NULL
                ACONST_NULL
                ACONST_NULL
                ACONST_NULL
                INVOKESTATIC com/sun/btrace/BTraceRuntime.forClass (Ljava/lang/Class;[Lcom/sun/btrace/shared/TimerHandler;[Lcom/sun/btrace/shared/EventHandler;[Lcom/sun/btrace/shared/ErrorHandler;[Lcom/sun/btrace/shared/ExitHandler;[Lcom/sun/btrace/shared/LowMemoryHandler;)Lcom/sun/btrace/BTraceRuntime;
                PUTSTATIC traces/onmethod/ArgsDurationErrAAA.runtime : Lcom/sun/btrace/BTraceRuntime;
                GETSTATIC traces/onmethod/ArgsDurationErrAAA.runtime : Lcom/sun/btrace/BTraceRuntime;
                INVOKESTATIC com/sun/btrace/BTraceRuntime.enter (Lcom/sun/btrace/BTraceRuntime;)Z
                IFNE L2
                INVOKESTATIC com/sun/btrace/BTraceRuntime.leave ()V
                RETURN
               L2
               FRAME SAME
                INVOKESTATIC com/sun/btrace/BTraceRuntime.start ()V
                RETURN
               L1
               FRAME SAME1 java/lang/Throwable
                INVOKESTATIC com/sun/btrace/BTraceRuntime.handleException (Ljava/lang/Throwable;)V
                INVOKESTATIC com/sun/btrace/BTraceRuntime.leave ()V
                RETURN
                MAXSTACK = 6
                MAXLOCALS = 0

              // access flags 0x1
              public <init>()V
                ALOAD 0
                INVOKESPECIAL java/lang/Object.<init> ()V
                RETURN
                MAXSTACK = 1
                MAXLOCALS = 1

              // access flags 0x9
              public static args(Ljava/lang/Throwable;Ljava/lang/String;J[Ljava/lang/String;[I)V
              @Lcom/sun/btrace/annotations/OnMethod;(clazz="/.*\\.OnMethodTest/", method="args", location=@Lcom/sun/btrace/annotations/Location;(value=Lcom/sun/btrace/annotations/Kind;.ERROR))
                TRYCATCHBLOCK L0 L1 L1 java/lang/Throwable
                GETSTATIC traces/onmethod/ArgsDurationErrAAA.runtime : Lcom/sun/btrace/BTraceRuntime;
                INVOKESTATIC com/sun/btrace/BTraceRuntime.enter (Lcom/sun/btrace/BTraceRuntime;)Z
                IFNE L0
                RETURN
               L0
               FRAME SAME
                LDC "args"
                INVOKESTATIC com/sun/btrace/BTraceUtils.println (Ljava/lang/Object;)V
                INVOKESTATIC com/sun/btrace/BTraceRuntime.leave ()V
                RETURN
               L1
               FRAME SAME1 java/lang/Throwable
                INVOKESTATIC com/sun/btrace/BTraceRuntime.handleException (Ljava/lang/Throwable;)V
                INVOKESTATIC com/sun/btrace/BTraceRuntime.leave ()V
                RETURN
                MAXSTACK = 1
                MAXLOCALS = 6
            }

       验证的话就是判断是否信任,是否需要验证,验证的内容包括基类中是不是包含Object之类,还有各种类型的方法的验证,比如构造函数比如INVOKESPECIAL关键字等等,可参考BTraceProbePersisted.verifyBytecode。


            $ xxd ArgsDurationErrAAA.class
            00000000: bace caca 0000 0001 0022 7472 6163 6573  ........."traces
            00000010: 2f6f 6e6d 6574 686f 642f 4172 6773 4475  /onmethod/ArgsDu
            00000020: 7261 7469 6f6e 4572 7241 4141 0000 0000  rationErrAAA....
            00000030: 0000 0001 0012 2f2e 2a5c 2e4f 6e4d 6574  ....../.*\.OnMet
            00000040: 686f 6454 6573 742f 0004 6172 6773 0000  hodTest/..args..
            00000050: 4028 4c6a 6176 612f 6c61 6e67 2f54 6872  @(Ljava/lang/Thr
            00000060: 6f77 6162 6c65 3b4c 6a61 7661 2f6c 616e  owable;Ljava/lan
            00000070: 672f 5374 7269 6e67 3b4a 5b4c 6a61 7661  g/String;J[Ljava
            00000080: 2f6c 616e 672f 5374 7269 6e67 3b5b 4929  /lang/String;[I)
            00000090: 5600 0461 7267 7300 00ff ffff ffff ffff  V..args.........
            000000a0: ffff ffff ffff ffff ffff ffff ffff ffff  ................
            000000b0: ffff ffff ff00 0000 044e 6f6e 6500 0000  .........None...
            000000c0: 0000 0005 4552 524f 5200 0642 4546 4f52  ....ERROR..BEFOR
            000000d0: 4501 0000 0100 0001 0000 0100 0000 0000  E...............
            000000e0: 0000 0000 0000 0000 0000 0003 9aca feba  ................
            000000f0: be00 0000 3300 2c01 0022 7472 6163 6573  ....3.,.."traces
            00000100: 2f6f 6e6d 6574 686f 642f 4172 6773 4475  /onmethod/ArgsDu
            00000110: 7261 7469 6f6e 4572 7241 4141 0700 0101  rationErrAAA....
            00000120: 0010 6a61 7661 2f6c 616e 672f 4f62 6a65  ..java/lang/Obje
            00000130: 6374 0700 0301 0023 4c63 6f6d 2f73 756e  ct.....#Lcom/sun
            00000140: 2f62 7472 6163 652f 616e 6e6f 7461 7469  /btrace/annotati
            00000150: 6f6e 732f 4254 7261 6365 3b01 0007 7275  ons/BTrace;...ru
            00000160: 6e74 696d 6501 001e 4c63 6f6d 2f73 756e  ntime...Lcom/sun
            00000170: 2f62 7472 6163 652f 4254 7261 6365 5275  /btrace/BTraceRu
            00000180: 6e74 696d 653b 0100 0e24 6274 7261 6365  ntime;...$btrace
            00000190: 2424 6c65 7665 6c01 0001 4903 0000 0000  $$level...I.....
            000001a0: 0100 083c 636c 696e 6974 3e01 0003 2829  ...<clinit>...()
            000001b0: 5601 0013 6a61 7661 2f6c 616e 672f 5468  V...java/lang/Th
            000001c0: 726f 7761 626c 6507 000d 0100 1c63 6f6d  rowable......com
            000001d0: 2f73 756e 2f62 7472 6163 652f 4254 7261  /sun/btrace/BTra
            000001e0: 6365 5275 6e74 696d 6507 000f 0100 0866  ceRuntime......f
            000001f0: 6f72 436c 6173 7301 00ed 284c 6a61 7661  orClass...(Ljava
            00000200: 2f6c 616e 672f 436c 6173 733b 5b4c 636f  /lang/Class;[Lco
            00000210: 6d2f 7375 6e2f 6274 7261 6365 2f73 6861  m/sun/btrace/sha
            00000220: 7265 642f 5469 6d65 7248 616e 646c 6572  red/TimerHandler
            00000230: 3b5b 4c63 6f6d 2f73 756e 2f62 7472 6163  ;[Lcom/sun/btrac
            00000240: 652f 7368 6172 6564 2f45 7665 6e74 4861  e/shared/EventHa
            00000250: 6e64 6c65 723b 5b4c 636f 6d2f 7375 6e2f  ndler;[Lcom/sun/
            00000260: 6274 7261 6365 2f73 6861 7265 642f 4572  btrace/shared/Er
            00000270: 726f 7248 616e 646c 6572 3b5b 4c63 6f6d  rorHandler;[Lcom
            00000280: 2f73 756e 2f62 7472 6163 652f 7368 6172  /sun/btrace/shar
            00000290: 6564 2f45 7869 7448 616e 646c 6572 3b5b  ed/ExitHandler;[
            000002a0: 4c63 6f6d 2f73 756e 2f62 7472 6163 652f  Lcom/sun/btrace/
            000002b0: 7368 6172 6564 2f4c 6f77 4d65 6d6f 7279  shared/LowMemory
            000002c0: 4861 6e64 6c65 723b 294c 636f 6d2f 7375  Handler;)Lcom/su
            000002d0: 6e2f 6274 7261 6365 2f42 5472 6163 6552  n/btrace/BTraceR
            000002e0: 756e 7469 6d65 3b0c 0011 0012 0a00 1000  untime;.........
            000002f0: 130c 0006 0007 0900 0200 1501 0005 656e  ..............en
            00000300: 7465 7201 0021 284c 636f 6d2f 7375 6e2f  ter..!(Lcom/sun/
            00000310: 6274 7261 6365 2f42 5472 6163 6552 756e  btrace/BTraceRun
            00000320: 7469 6d65 3b29 5a0c 0017 0018 0a00 1000  time;)Z.........
            00000330: 1901 0005 6c65 6176 650c 001b 000c 0a00  ....leave.......
            00000340: 1000 1c01 0005 7374 6172 740c 001e 000c  ......start.....
            00000350: 0a00 1000 1f01 000f 6861 6e64 6c65 4578  ........handleEx
            00000360: 6365 7074 696f 6e01 0018 284c 6a61 7661  ception...(Ljava
            00000370: 2f6c 616e 672f 5468 726f 7761 626c 653b  /lang/Throwable;
            00000380: 2956 0c00 2100 220a 0010 0023 0100 063c  )V..!."....#...<
            00000390: 696e 6974 3e0c 0025 000c 0a00 0400 2601  init>..%......&.
            000003a0: 000d 436f 6e73 7461 6e74 5661 6c75 6501  ..ConstantValue.
            000003b0: 0004 436f 6465 0100 0d53 7461 636b 4d61  ..Code...StackMa
            000003c0: 7054 6162 6c65 0100 1952 756e 7469 6d65  pTable...Runtime
            000003d0: 5669 7369 626c 6541 6e6e 6f74 6174 696f  VisibleAnnotatio
            000003e0: 6e73 0021 0002 0004 0000 0002 0009 0006  ns.!............
            000003f0: 0007 0000 0049 0008 0009 0001 0028 0000  .....I.......(..
            00000400: 0002 000a 0002 0009 000b 000c 0001 0029  ...............)
            00000410: 0000 0046 0006 0000 0000 0025 1202 0101  ...F.......%....
            00000420: 0101 01b8 0014 b300 16b2 0016 b800 1a9a  ................
            00000430: 0007 b800 1db1 b800 20b1 b800 24b8 001d  ........ ...$...
            00000440: b100 0100 0000 1e00 1e00 0e00 0100 2a00  ..............*.
            00000450: 0000 0700 021a 4307 000e 0001 0025 000c  ......C......%..
            00000460: 0001 0029 0000 0011 0001 0001 0000 0005  ...)............
            00000470: 2ab7 0027 b100 0000 0000 0100 2b00 0000  *..'........+...
            00000480: 0600 0100 0500 0000 0005 55ca feba be00  ..........U.....
            00000490: 0000 3300 3e01 0022 7472 6163 6573 2f6f  ..3.>.."traces/o
            000004a0: 6e6d 6574 686f 642f 4172 6773 4475 7261  nmethod/ArgsDura
            000004b0: 7469 6f6e 4572 7241 4141 0700 0101 0010  tionErrAAA......
            000004c0: 6a61 7661 2f6c 616e 672f 4f62 6a65 6374  java/lang/Object
            000004d0: 0700 0301 0023 4c63 6f6d 2f73 756e 2f62  .....#Lcom/sun/b
            000004e0: 7472 6163 652f 616e 6e6f 7461 7469 6f6e  trace/annotation
            000004f0: 732f 4254 7261 6365 3b01 0007 7275 6e74  s/BTrace;...runt
            00000500: 696d 6501 001e 4c63 6f6d 2f73 756e 2f62  ime...Lcom/sun/b
            00000510: 7472 6163 652f 4254 7261 6365 5275 6e74  trace/BTraceRunt
            00000520: 696d 653b 0100 0e24 6274 7261 6365 2424  ime;...$btrace$$
            00000530: 6c65 7665 6c01 0001 4903 0000 0000 0100  level...I.......
            00000540: 083c 636c 696e 6974 3e01 0003 2829 5601  .<clinit>...()V.
            00000550: 0013 6a61 7661 2f6c 616e 672f 5468 726f  ..java/lang/Thro
            00000560: 7761 626c 6507 000d 0100 1c63 6f6d 2f73  wable......com/s
            00000570: 756e 2f62 7472 6163 652f 4254 7261 6365  un/btrace/BTrace
            00000580: 5275 6e74 696d 6507 000f 0100 0866 6f72  Runtime......for
            00000590: 436c 6173 7301 00ed 284c 6a61 7661 2f6c  Class...(Ljava/l
            000005a0: 616e 672f 436c 6173 733b 5b4c 636f 6d2f  ang/Class;[Lcom/
            000005b0: 7375 6e2f 6274 7261 6365 2f73 6861 7265  sun/btrace/share
            000005c0: 642f 5469 6d65 7248 616e 646c 6572 3b5b  d/TimerHandler;[
            000005d0: 4c63 6f6d 2f73 756e 2f62 7472 6163 652f  Lcom/sun/btrace/
            000005e0: 7368 6172 6564 2f45 7665 6e74 4861 6e64  shared/EventHand
            000005f0: 6c65 723b 5b4c 636f 6d2f 7375 6e2f 6274  ler;[Lcom/sun/bt
            00000600: 7261 6365 2f73 6861 7265 642f 4572 726f  race/shared/Erro
            00000610: 7248 616e 646c 6572 3b5b 4c63 6f6d 2f73  rHandler;[Lcom/s
            00000620: 756e 2f62 7472 6163 652f 7368 6172 6564  un/btrace/shared
            00000630: 2f45 7869 7448 616e 646c 6572 3b5b 4c63  /ExitHandler;[Lc
            00000640: 6f6d 2f73 756e 2f62 7472 6163 652f 7368  om/sun/btrace/sh
            00000650: 6172 6564 2f4c 6f77 4d65 6d6f 7279 4861  ared/LowMemoryHa
            00000660: 6e64 6c65 723b 294c 636f 6d2f 7375 6e2f  ndler;)Lcom/sun/
            00000670: 6274 7261 6365 2f42 5472 6163 6552 756e  btrace/BTraceRun
            00000680: 7469 6d65 3b0c 0011 0012 0a00 1000 130c  time;...........
            00000690: 0006 0007 0900 0200 1501 0005 656e 7465  ............ente
            000006a0: 7201 0021 284c 636f 6d2f 7375 6e2f 6274  r..!(Lcom/sun/bt
            000006b0: 7261 6365 2f42 5472 6163 6552 756e 7469  race/BTraceRunti
            000006c0: 6d65 3b29 5a0c 0017 0018 0a00 1000 1901  me;)Z...........
            000006d0: 0005 6c65 6176 650c 001b 000c 0a00 1000  ..leave.........
            000006e0: 1c01 0005 7374 6172 740c 001e 000c 0a00  ....start.......
            000006f0: 1000 1f01 000f 6861 6e64 6c65 4578 6365  ......handleExce
            00000700: 7074 696f 6e01 0018 284c 6a61 7661 2f6c  ption...(Ljava/l
            00000710: 616e 672f 5468 726f 7761 626c 653b 2956  ang/Throwable;)V
            00000720: 0c00 2100 220a 0010 0023 0100 063c 696e  ..!."....#...<in
            00000730: 6974 3e0c 0025 000c 0a00 0400 2601 0004  it>..%......&...
            00000740: 6172 6773 0100 4028 4c6a 6176 612f 6c61  args..@(Ljava/la
            00000750: 6e67 2f54 6872 6f77 6162 6c65 3b4c 6a61  ng/Throwable;Lja
            00000760: 7661 2f6c 616e 672f 5374 7269 6e67 3b4a  va/lang/String;J
            00000770: 5b4c 6a61 7661 2f6c 616e 672f 5374 7269  [Ljava/lang/Stri
            00000780: 6e67 3b5b 4929 5601 0025 4c63 6f6d 2f73  ng;[I)V..%Lcom/s
            00000790: 756e 2f62 7472 6163 652f 616e 6e6f 7461  un/btrace/annota
            000007a0: 7469 6f6e 732f 4f6e 4d65 7468 6f64 3b01  tions/OnMethod;.
            000007b0: 0005 636c 617a 7a01 0012 2f2e 2a5c 2e4f  ..clazz.../.*\.O
            000007c0: 6e4d 6574 686f 6454 6573 742f 0100 066d  nMethodTest/...m
            000007d0: 6574 686f 6401 0008 6c6f 6361 7469 6f6e  ethod...location
            000007e0: 0100 254c 636f 6d2f 7375 6e2f 6274 7261  ..%Lcom/sun/btra
            000007f0: 6365 2f61 6e6e 6f74 6174 696f 6e73 2f4c  ce/annotations/L
            00000800: 6f63 6174 696f 6e3b 0100 0576 616c 7565  ocation;...value
            00000810: 0100 214c 636f 6d2f 7375 6e2f 6274 7261  ..!Lcom/sun/btra
            00000820: 6365 2f61 6e6e 6f74 6174 696f 6e73 2f4b  ce/annotations/K
            00000830: 696e 643b 0100 0545 5252 4f52 0800 2801  ind;...ERROR..(.
            00000840: 001a 636f 6d2f 7375 6e2f 6274 7261 6365  ..com/sun/btrace
            00000850: 2f42 5472 6163 6555 7469 6c73 0700 3401  /BTraceUtils..4.
            00000860: 0007 7072 696e 746c 6e01 0015 284c 6a61  ..println...(Lja
            00000870: 7661 2f6c 616e 672f 4f62 6a65 6374 3b29  va/lang/Object;)
            00000880: 560c 0036 0037 0a00 3500 3801 000d 436f  V..6.7..5.8...Co
            00000890: 6e73 7461 6e74 5661 6c75 6501 0004 436f  nstantValue...Co
            000008a0: 6465 0100 0d53 7461 636b 4d61 7054 6162  de...StackMapTab
            000008b0: 6c65 0100 1952 756e 7469 6d65 5669 7369  le...RuntimeVisi
            000008c0: 626c 6541 6e6e 6f74 6174 696f 6e73 0021  bleAnnotations.!
            000008d0: 0002 0004 0000 0002 0009 0006 0007 0000  ................
            000008e0: 0049 0008 0009 0001 003a 0000 0002 000a  .I.......:......
            000008f0: 0003 0009 000b 000c 0001 003b 0000 0046  ...........;...F
            00000900: 0006 0000 0000 0025 1202 0101 0101 01b8  .......%........
            00000910: 0014 b300 16b2 0016 b800 1a9a 0007 b800  ................
            00000920: 1db1 b800 20b1 b800 24b8 001d b100 0100  .... ...$.......
            00000930: 0000 1e00 1e00 0e00 0100 3c00 0000 0700  ..........<.....
            00000940: 021a 4307 000e 0001 0025 000c 0001 003b  ..C......%.....;
            00000950: 0000 0011 0001 0001 0000 0005 2ab7 0027  ............*..'
            00000960: b100 0000 0000 0900 2800 2900 0200 3b00  ........(.)...;.
            00000970: 0000 3b00 0100 0600 0000 1ab2 0016 b800  ..;.............
            00000980: 1a9a 0004 b112 33b8 0039 b800 1db1 b800  ......3..9......
            00000990: 24b8 001d b100 0100 0a00 1300 1300 0e00  $...............
            000009a0: 0100 3c00 0000 0700 020a 4807 000e 003d  ..<.......H....=
            000009b0: 0000 001e 0001 002a 0003 002b 7300 2c00  .......*...+s.,.
            000009c0: 2d73 0028 002e 4000 2f00 0100 3065 0031  -s.(..@./...0e.1
            000009d0: 0032 0001 003d 0000 0006 0001 0005 0000  .2...=..........
            000009e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            000009f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a00: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a20: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a30: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a40: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a60: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a70: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a80: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000a90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000aa0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ab0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ac0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ad0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ae0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000af0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b00: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b20: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b30: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b40: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b60: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b70: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b80: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000b90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ba0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000bb0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000bc0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000bd0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000be0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000bf0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c00: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c20: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c30: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c40: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c60: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c70: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c80: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000c90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ca0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000cb0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000cc0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000cd0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ce0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000cf0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d00: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d20: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d30: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d40: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d60: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d70: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d80: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000d90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000da0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000db0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000dc0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000dd0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000de0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000df0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e00: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e20: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e30: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e40: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e60: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e70: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e80: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000e90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ea0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000eb0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ec0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ed0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ee0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ef0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f00: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f10: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f20: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f30: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f40: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f60: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f70: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f80: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000f90: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000fa0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000fb0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000fc0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000fd0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000fe0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
            00000ff0: 0000 0000 0000 0000 0000 0000 0000 0000  ................