You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2014/02/23 21:40:47 UTC

svn commit: r1571088 - in /incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent: SironaAgent.java SironaTransformer.java

Author: rmannibucau
Date: Sun Feb 23 20:40:47 2014
New Revision: 1571088

URL: http://svn.apache.org/r1571088
Log:
adding debug option to dump in tmp generated bytecode

Modified:
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java?rev=1571088&r1=1571087&r2=1571088&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java Sun Feb 23 20:40:47 2014
@@ -98,12 +98,13 @@ public class SironaAgent {
 
 
         try {
-            final SironaTransformer transformer = SironaTransformer.class.cast(loader.loadClass("org.apache.sirona.javaagent.SironaTransformer").newInstance());
-            instrumentation.addTransformer(transformer, instrumentation.isRetransformClassesSupported());
+            final SironaTransformer transformer = new SironaTransformer("true".equals(extractConfig(agentArgs, "debug=")));
+            final boolean reloadable = instrumentation.isRetransformClassesSupported() && FORCE_RELOAD;
+            instrumentation.addTransformer(transformer, reloadable);
 
             final Class<? extends Annotation> instrumentedMarker = (Class<? extends Annotation>) loader.loadClass("org.apache.sirona.javaagent.Instrumented");
             final Class<?> listener = loader.loadClass("org.apache.sirona.javaagent.spi.InvocationListener");
-            if (instrumentation.isRetransformClassesSupported() && FORCE_RELOAD) {
+            if (reloadable) {
                 for (final Class<?> clazz : instrumentation.getAllLoadedClasses()) {
                     if (!clazz.isArray()
                             && !listener.isAssignableFrom(clazz)

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java?rev=1571088&r1=1571087&r2=1571088&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java Sun Feb 23 20:40:47 2014
@@ -20,6 +20,8 @@ import org.apache.sirona.javaagent.loggi
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassWriter;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
 import java.security.ProtectionDomain;
@@ -27,6 +29,12 @@ import java.security.ProtectionDomain;
 public class SironaTransformer implements ClassFileTransformer {
     private static final String DELEGATING_CLASS_LOADER = "sun.reflect.DelegatingClassLoader";
 
+    private final boolean debug;
+
+    public SironaTransformer(final boolean debug) {
+        this.debug = debug;
+    }
+
     @Override
     public byte[] transform(final ClassLoader loader, final String className, final Class<?> classBeingRedefined,
                             final ProtectionDomain protectionDomain, final byte[] classfileBuffer) throws IllegalClassFormatException {
@@ -45,7 +53,23 @@ public class SironaTransformer implement
                 final ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
                 final SironaClassVisitor advisor = new SironaClassVisitor(writer, className, keyVisitor.getKeys());
                 reader.accept(advisor, ClassReader.SKIP_DEBUG);
-                return writer.toByteArray();
+
+                final byte[] bytes = writer.toByteArray();
+                if (debug) {
+                    final File dump = new File(System.getProperty("java.io.tmpdir"), "sirona-dump/" + className + ".class");
+                    dump.getParentFile().mkdirs();
+                    FileOutputStream w = null;
+                    try {
+                        w = new FileOutputStream(dump);
+                        w.write(bytes);
+                    } finally {
+                        if (w != null) {
+                            w.close();
+                        }
+                    }
+                }
+
+                return bytes;
             }
             return classfileBuffer;
         } catch (final Exception e) {