public Instrumentor(Class clazz, String btraceClassName, byte[] btraceCode, List<OnMethod> onMethods, ClassVisitor cv) { this(clazz, btraceClassName, new ClassReader(btraceCode), onMethods, cv); }
public boolean isCandidate(byte[] classBytes) { return isCandidate(new ClassReader(classBytes)); }
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()); } }
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()); } }
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()); } }
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(String[] args) throws Exception { if (args.length == 0) { usage("java net.java.btrace.runtime.Verifier <.class file>"); } args[0] = args[0].replace('.', '/'); File file = new File(args[0] + ".class"); if (! file.exists()) { usage("file '" + args[0] + ".class' does not exist"); } FileInputStream fis = new FileInputStream(file); ClassReader reader = new ClassReader(new BufferedInputStream(fis)); Verifier verifier = new Verifier(new ClassVisitor(Opcodes.ASM4){}); reader.accept(verifier, 0); } }
private static byte[] removeMethods(byte[] buf) { ClassWriter writer = InstrumentUtils.newClassWriter(buf); ClassReader reader = new ClassReader(buf); InstrumentUtils.accept(reader, new MethodRemover(writer)); return writer.toByteArray(); }
private static byte[] removeMethods(byte[] buf) { ClassWriter writer = InstrumentUtils.newClassWriter(buf); ClassReader reader = new ClassReader(buf); InstrumentUtils.accept(reader, new MethodRemover(writer)); return writer.toByteArray(); }
private void verify(byte[] buf) { ClassReader reader = new ClassReader(buf); Verifier verifier = new Verifier(new ClassVisitor(Opcodes.ASM4) { }, false, lookup.lookup(ExtensionsRepository.class)); BTraceLogger.debugPrint("verifying BTrace class"); // NOI18N InstrumentUtils.accept(reader, verifier); className = verifier.getClassName().replace('/', '.'); BTraceLogger.debugPrint("verified '" + className + "' successfully"); // NOI18N onMethods = verifier.getOnMethods(); onProbes = verifier.getOnProbes(); if (onProbes != null && !onProbes.isEmpty()) { // map @OnProbe's to @OnMethod's and store onMethods.addAll(mapOnProbes(onProbes)); } for (OnMethod om : onMethods) { if (om.getClazz().startsWith("+")) { hasSubclassChecks = true; break; } } }
private byte[] instrument(Class clazz, String cname, byte[] target) { byte[] instrumentedCode; try { ClassWriter writer = InstrumentUtils.newClassWriter(target); ClassReader reader = new ClassReader(target); Instrumentor i = new Instrumentor(clazz, className, btraceCode, onMethods, writer); InstrumentUtils.accept(reader, i); if (!i.hasMatch()) { BTraceLogger.debugPrint("*WARNING* No method was matched for class " + cname); // NOI18N } else { instrumentedClasses.add(cname.replace('/', '.')); } instrumentedCode = writer.toByteArray(); } catch (Throwable th) { BTraceLogger.debugPrint(th); return null; } BTraceLogger.dumpClass(cname, instrumentedCode); return instrumentedCode; }
private void verify(byte[] buf) { ClassReader reader = new ClassReader(buf); Verifier verifier = new Verifier(new ClassVisitor(Opcodes.ASM4) { }, lookup.lookup(Settings.class).unsafeMode, lookup.lookup(ExtensionsRepository.class)); BTraceLogger.debugPrint("verifying BTrace class"); // NOI18N InstrumentUtils.accept(reader, verifier); className = verifier.getClassName().replace('/', '.'); BTraceLogger.debugPrint("verified '" + className + "' successfully"); // NOI18N onMethods = verifier.getOnMethods(); onProbes = verifier.getOnProbes(); if (onProbes != null && !onProbes.isEmpty()) { // map @OnProbe's to @OnMethod's and store onMethods.addAll(mapOnProbes(onProbes)); } for (OnMethod om : onMethods) { if (om.getClazz().startsWith("+")) { hasSubclassChecks = true; break; } } }
private static byte[] injectExtensionContext(byte[] target) { try { ClassWriter writer = InstrumentUtils.newClassWriter(target); ClassReader reader = new ClassReader(target); ExtensionRuntimeProcessor injector = new ExtensionRuntimeProcessor(writer); InstrumentUtils.accept(reader, injector); return injector.isApplied() ? writer.toByteArray() : null; } catch (Throwable th) { BTraceLogger.debugPrint(th); return null; } }
private byte[] instrument(Class clazz, String cname, byte[] target) { byte[] instrumentedCode; try { ClassWriter writer = InstrumentUtils.newClassWriter(target); ClassReader reader = new ClassReader(target); Instrumentor i = new Instrumentor(clazz, className, btraceCode, onMethods, writer); InstrumentUtils.accept(reader, i); if (!i.hasMatch()) { BTraceLogger.debugPrint("*WARNING* No method was matched for class " + cname); // NOI18N } else { instrumentedClasses.add(cname.replace('/', '.')); } instrumentedCode = writer.toByteArray(); } catch (Throwable th) { BTraceLogger.debugPrint(th); return null; } BTraceLogger.dumpClass(cname, instrumentedCode); return instrumentedCode; }
private static byte[] injectExtensionContext(byte[] target) { try { ClassWriter writer = InstrumentUtils.newClassWriter(target); ClassReader reader = new ClassReader(target); ExtensionRuntimeProcessor injector = new ExtensionRuntimeProcessor(writer); InstrumentUtils.accept(reader, injector); return injector.isApplied() ? writer.toByteArray() : null; } catch (Throwable th) { BTraceLogger.debugPrint(th); return null; } }
protected void transform(String traceName) throws IOException { Trace btrace = loadTrace(traceName); ClassReader reader = new ClassReader(originalBC); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new Instrumentor(null, btrace.className, btrace.content, btrace.onMethods, writer)); transformedBC = writer.toByteArray(); System.err.println("==== " + traceName); }
@Override protected void transform(String traceName) throws IOException { ClassReader reader = new ClassReader(originalBC); ClassWriter writer = InstrumentUtils.newClassWriter(); InstrumentUtils.accept(reader, new ExtensionRuntimeProcessor(writer)); transformedBC = 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 Trace loadTrace(String name) throws IOException { byte[] btrace = loadFile("traces/" + name + ".class"); ClassWriter writer = InstrumentUtils.newClassWriter(); Verifier verifier = new Verifier(new Preprocessor(writer)); InstrumentUtils.accept(new ClassReader(btrace), verifier); return new Trace(writer.toByteArray(), verifier.getOnMethods(), verifier.getClassName()); }