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) {