From 3a1debcbb831f802219b341fb5e37467b365d443 Mon Sep 17 00:00:00 2001 From: mchr3k Date: Sun, 13 Apr 2014 13:59:51 +0100 Subject: [PATCH] Implement issue #31 --- org.intrace/lib/intrace-agent.jar | Bin 387434 -> 388128 bytes .../org/intrace/agent/ClassTransformer.java | 69 ++++++++++++++---- .../testsrc/example/ISomeKindOfInterface.java | 6 ++ .../testsrc/example/ImplWithTerribleName.java | 10 +++ org.intrace/testsrc/example/TraceExample.java | 13 ++-- 5 files changed, 77 insertions(+), 21 deletions(-) create mode 100644 org.intrace/testsrc/example/ISomeKindOfInterface.java create mode 100644 org.intrace/testsrc/example/ImplWithTerribleName.java diff --git a/org.intrace/lib/intrace-agent.jar b/org.intrace/lib/intrace-agent.jar index 1995c147e97297975e6d19fd1eaca8032276c043..abd8a3c463b9f0376f159ca6822b026e327f18d0 100644 GIT binary patch delta 18870 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 a`%V~L2RDai#GN3%0i{Pei~>K@!Tmo%#eo3; delta 18098 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 WKEZ|9aFB diff --git a/org.intrace/src/org/intrace/agent/ClassTransformer.java b/org.intrace/src/org/intrace/agent/ClassTransformer.java index 912875c..85f774a 100644 --- a/org.intrace/src/org/intrace/agent/ClassTransformer.java +++ b/org.intrace/src/org/intrace/agent/ClassTransformer.java @@ -29,6 +29,8 @@ import org.intrace.output.trace.TraceHandler; import org.intrace.shared.AgentConfigConstants; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.commons.EmptyVisitor; /** * Uses ASM2 to transform class files to add Trace instrumentation. @@ -139,13 +141,15 @@ private byte[] getInstrumentedClassBytes(String xiClassName, * @param klass * @param className * @param protectionDomain + * @param originalClassfile * @return True if the Class with name className should be instrumented. */ private boolean isToBeConsideredForInstrumentation( Class klass, ClassLoader klassloader, String className, - ProtectionDomain protectionDomain) + ProtectionDomain protectionDomain, + byte[] originalClassfile) { ComparableClassName compklass = new ComparableClassName(className, klassloader); @@ -195,18 +199,59 @@ private boolean isToBeConsideredForInstrumentation( if ((settings.getClassRegex() == null) || !matches(settings.getClassRegex(), className)) { - if (settings.isVerboseMode()) + // Actually we should modify if any of the interfaces match the regex + boolean matchedInterface = false; + for(String klassInterface : getInterfaces(className, originalClassfile)) { - TraceHandler.INSTANCE.writeTraceOutput("DEBUG: Ignoring class not matching the active include regex: " - + className); + if ((settings.getClassRegex() != null) + && matches(settings.getClassRegex(), klassInterface)) + { + matchedInterface |= true; + } + } + + if(!matchedInterface) + { + if (settings.isVerboseMode()) + { + TraceHandler.INSTANCE.writeTraceOutput("DEBUG: Ignoring class not matching the active include regex: " + + className); + } + return false; } - return false; } // All checks passed - class can be instrumented return true; } + private String[] getInterfaces(String className, byte[] originalClassfile) + { + try + { + final String[][] interfaceNames = new String[1][]; + ClassReader cr = new ClassReader(originalClassfile); + ClassVisitor cv = new EmptyVisitor() { + @Override + public void visit(int version, int access, String name, + String signature, String superName, String[] interfaces) + { + interfaceNames[0] = interfaces; + super.visit(version, access, name, signature, superName, interfaces); + } + }; + cr.accept(cv, 0); + return interfaceNames[0]; + } + catch (Throwable th) + { + System.err.println("Caught Throwable when trying to instrument: " + + className); + th.printStackTrace(); + return new String[0]; + } + } + private boolean matches(String[] strs, String target) { for (String str : strs) @@ -259,8 +304,9 @@ public byte[] transform(ClassLoader loader, String internalClassName, int allClassesSize = allClasses.size(); boolean shouldInstrument = isToBeConsideredForInstrumentation(classBeingRedefined, loader, - className, protectionDomain); - if (shouldInstrument || "java.lang.Thread".equals(className)) + className, protectionDomain, + originalClassfile); + if (shouldInstrument && !"java.lang.Thread".equals(className)) { // System.out.println("!! Instrumenting class: " + compclass); @@ -585,8 +631,6 @@ private Set getModifiedClasses() *
  • Class is an annotation *
  • Class is synthetic *
  • Class is not modifiable - *
  • Class is rejected by - * {@link ClassTransformer#isToBeConsideredForInstrumentation(String, ProtectionDomain)} * */ public Set getLoadedClassesForModification() @@ -620,12 +664,7 @@ else if (!inst.isModifiableClass(loadedClass)) + loadedClass.getCanonicalName()); } } - else if (isToBeConsideredForInstrumentation( - loadedClass, - loadedClass.getClassLoader(), - loadedClass.getName(), - loadedClass - .getProtectionDomain())) + else { ComparableClass loadedKlass = new ComparableClass(loadedClass); unmodifiedKlasses.add(loadedKlass); diff --git a/org.intrace/testsrc/example/ISomeKindOfInterface.java b/org.intrace/testsrc/example/ISomeKindOfInterface.java new file mode 100644 index 0000000..f9b66f7 --- /dev/null +++ b/org.intrace/testsrc/example/ISomeKindOfInterface.java @@ -0,0 +1,6 @@ +package example; + +public interface ISomeKindOfInterface +{ + public void shoutOut(); +} diff --git a/org.intrace/testsrc/example/ImplWithTerribleName.java b/org.intrace/testsrc/example/ImplWithTerribleName.java new file mode 100644 index 0000000..36fe0fb --- /dev/null +++ b/org.intrace/testsrc/example/ImplWithTerribleName.java @@ -0,0 +1,10 @@ +package example; + +public class ImplWithTerribleName implements ISomeKindOfInterface +{ + @Override + public void shoutOut() + { + System.out.println("Woohoo!"); + } +} diff --git a/org.intrace/testsrc/example/TraceExample.java b/org.intrace/testsrc/example/TraceExample.java index a6b0969..c040d2e 100644 --- a/org.intrace/testsrc/example/TraceExample.java +++ b/org.intrace/testsrc/example/TraceExample.java @@ -6,13 +6,13 @@ public class TraceExample { - + private static Map map = new HashMap(); static { map.put("foo", "bar"); } - + /** * @param args * @throws Exception @@ -23,7 +23,7 @@ public static void main(String[] args) try { otherMain(args[0]); - } + } catch (Throwable ex) { ex.printStackTrace(); @@ -38,6 +38,7 @@ public static void otherMain(String arg) throws Exception InnerTestClass.foo(); workMethod("foobar"); new InnerTestClass().boolMethod(true); + new ImplWithTerribleName().shoutOut(); } } @@ -72,7 +73,7 @@ private static String exceptionMethod() } catch (Exception ex) { - return "seen exception"; + return "seen exception"; } return "no exception"; } @@ -89,12 +90,12 @@ private void instanceFoo() { System.setProperty("a", "foobar"); } - + private void boolMethod(boolean xiArg) { System.out.println(Boolean.toString(xiArg)); } - + private static void foo() { System.setProperty("a", "bar");