public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: java net.java.btrace.runtime.ClassRenamer <class> <new-class-name>"); System.exit(1); } args[0] = args[0].replace('.', '/'); args[1] = args[1].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[1] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassRenamer(args[1], writer)); fos.write(writer.toByteArray()); } }
protected String getCommonSuperClass(String type1, String type2) { try { return super.getCommonSuperClass(type1, type2); } catch (LinkageError le) { return JAVA_LANG_OBJECT; } catch (RuntimeException re) { return JAVA_LANG_OBJECT; } } };
@Override public byte[] transform(ClassLoader loader, final String cname, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (!hasSubclassChecks || classBeingRedefined != null || isBTraceClass(cname) || isSensitiveClass(cname)) { return null; } if (!skipRetransforms) { BTraceLogger.debugPrint("injecting <clinit> for " + cname); // NOI18N ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES); ClinitInjector injector = new ClinitInjector(cw, className, cname); InstrumentUtils.accept(cr, injector); if (injector.isTransformed()) { byte[] instrumentedCode = cw.toByteArray(); BTraceLogger.dumpClass(cname + "_clinit", instrumentedCode); // NOI18N return instrumentedCode; } } else { BTraceLogger.debugPrint("client " + className + ": skipping transform for " + cname); // NOI18N } return null; } };
cw.visit(V1_1, ACC_PUBLIC, className, null, "java/lang/Object", new String[] { "java/lang/Runnable" }); MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", mw = cw.visitMethod(ACC_PUBLIC, "run", "()V", mw.visitMaxs(1, 1); mw.visitEnd(); return cw.toByteArray();
dump(name + "_before", classBytes.get(name)); ClassReader cr = new ClassReader(classBytes.get(name)); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); ClassVisitor cv = new ClassVisitor(Opcodes.ASM4, cw) { result.put(name, cw.toByteArray()); dump(name + "_after", cw.toByteArray());
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.CatchInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new CatchInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
@Override public byte[] transform(ClassLoader loader, final String cname, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (!hasSubclassChecks || classBeingRedefined != null || isBTraceClass(cname) || isSensitiveClass(cname)) { return null; } if (!skipRetransforms) { BTraceLogger.debugPrint("injecting <clinit> for " + cname); // NOI18N ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES); ClinitInjector injector = new ClinitInjector(cw, className, cname); InstrumentUtils.accept(cr, injector); if (injector.isTransformed()) { byte[] instrumentedCode = cw.toByteArray(); BTraceLogger.dumpClass(cname + "_clinit", instrumentedCode); // NOI18N return instrumentedCode; } } else { BTraceLogger.debugPrint("client " + className + ": skipping transform for " + cname); // NOI18N } return null; } };
protected String getCommonSuperClass(String type1, String type2) { try { return super.getCommonSuperClass(type1, type2); } catch (LinkageError le) { return JAVA_LANG_OBJECT; } catch (RuntimeException re) { return JAVA_LANG_OBJECT; } } };
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.MethodEntryInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodEntryInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
dump(name + "_before", classBytes.get(name)); ClassReader cr = new ClassReader(classBytes.get(name)); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); ClassVisitor cv = new ClassVisitor(Opcodes.ASM4, cw) { result.put(name, cw.toByteArray()); dump(name + "_after", cw.toByteArray());
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.ArrayAllocInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ArrayAllocInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.TypeCheckInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new TypeCheckInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.ThrowInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ThrowInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.ErrorReturnInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ErrorReturnInstrumentor(mv, null, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.MethodReturnInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodReturnInstrumentor(mv, null, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.ErrorReturnInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodEntryExitInstrumentor(mv, null, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.MethodCallInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodCallInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
public static void main(final String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: java net.java.btrace.runtime.LineNumberInstrumentor <class>"); System.exit(1); } args[0] = args[0].replace('.', '/'); FileInputStream fis = new FileInputStream(args[0] + ".class"); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); FileOutputStream fos = new FileOutputStream(args[0] + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ClassVisitor(Opcodes.ASM4, writer) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new LineNumberInstrumentor(mv, args[0], args[0], access, name, desc); } }); fos.write(writer.toByteArray()); } }
fos.write(writer.toByteArray());
fos.write(writer.toByteArray());