klasses = getModifiedClasses();
modifiedClasses.clear();
klasses.addAll(getLoadedClassesForModification());
@@ -656,7 +676,12 @@ public class ClassTransformer implements ClassFileTransformer
+ loadedClass.getCanonicalName());
}
}
- else
+ else if (settings.instrumentImplementors() || isToBeConsideredForInstrumentation(
+ loadedClass,
+ loadedClass.getClassLoader(),
+ loadedClass.getName(),
+ loadedClass.getProtectionDomain(),
+ null ))
{
ComparableClass loadedKlass = new ComparableClass(loadedClass);
unmodifiedKlasses.add(loadedKlass);
@@ -665,6 +690,18 @@ public class ClassTransformer implements ClassFileTransformer
return unmodifiedKlasses;
}
+/*
+The catch block in this method should have caught the following, but it did not.
+Need to figure out why.
+
+ [java] java.lang.VerifyError
+ [java] at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
+ [java] at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
+ [java] at org.intrace.agent.ClassTransformer.instrumentKlasses(ClassTransformer.java:719)
+ [java] at org.intrace.agent.ClassTransformer.getResponse(ClassTransformer.java:584)
+ [java] at org.intrace.agent.server.AgentClientConnection.runMethod(AgentClientConnection.java:118)
+
+*/
public void instrumentKlasses(Set klasses)
{
if (!inst.isRetransformClassesSupported())
@@ -692,10 +729,10 @@ public class ClassTransformer implements ClassFileTransformer
inst.retransformClasses(klass.klass);
countNumClasses++;
- if ((countNumClasses % 100) == 0)
- {
+// if ((countNumClasses % 100) == 0)
+// {
broadcastProgress(countNumClasses, totalNumClasses);
- }
+// }
}
catch (Throwable e)
{
@@ -711,7 +748,7 @@ public class ClassTransformer implements ClassFileTransformer
finally
{
bulkUpdateActive.set(false);
- broadcastStatus(modifiedClasses.size(), allClasses.size());
+ broadcastStatus(modifiedClasses.size(), allClassesCount.get());
}
}
diff --git a/org.intrace/src/org/intrace/agent/InstrumentedClassWriter.java b/org.intrace/src/org/intrace/agent/InstrumentedClassWriter.java
index c707020..e1cff72 100644
--- a/org.intrace/src/org/intrace/agent/InstrumentedClassWriter.java
+++ b/org.intrace/src/org/intrace/agent/InstrumentedClassWriter.java
@@ -79,6 +79,7 @@ public class InstrumentedClassWriter extends ClassWriter
sb.append(InstrCriteria.CLASS_METHOD_DELIMITER);
sb.append(name);
sb.append(desc);
+ //System.out.println("@#%:" + sb.toString() );
TraceHandler.INSTANCE.writeTraceOutput("DEBUG: method signature: " + sb.toString());
}
MethodVisitor mv = super.visitMethod(access, name, desc, signature,
diff --git a/org.intrace/src/org/intrace/output/trace/TraceHandler.java b/org.intrace/src/org/intrace/output/trace/TraceHandler.java
index d6f2393..88ed9ae 100644
--- a/org.intrace/src/org/intrace/output/trace/TraceHandler.java
+++ b/org.intrace/src/org/intrace/output/trace/TraceHandler.java
@@ -472,7 +472,7 @@ private static final Object STACK_ELE_DELIM = ",";
+ "]:" + xiOutput;
// if (AgentHelper.getOutputSettings().isStdoutOutputEnabled())
// {
-//// System.out.println(traceString);
+// System.out.println(traceString);
// }
if (AgentHelper.getOutputSettings().isFileOutputEnabled())
diff --git a/org.intrace/src/org/intrace/shared/AgentConfigConstants.java b/org.intrace/src/org/intrace/shared/AgentConfigConstants.java
index d4826bc..a788176 100644
--- a/org.intrace/src/org/intrace/shared/AgentConfigConstants.java
+++ b/org.intrace/src/org/intrace/shared/AgentConfigConstants.java
@@ -24,6 +24,7 @@ public class AgentConfigConstants
public static final String OPT_SERVER_PORT = "[serverport-";
public static final String CALLBACK_PORT = "[callbackport-";
public static final String EXIT_STACK_TRACE = "[exit-stack-trace-";
+ public static final String INSTRUMENT_IMPLEMENTORS = "[instrument-implementors";
public static final String START_WAIT = "[startwait";
public static final String START_ACTIVATE = "[startactivate";
@@ -39,5 +40,6 @@ public class AgentConfigConstants
COMMANDS.add(OPT_SERVER_PORT + "");
COMMANDS.add(CALLBACK_PORT + "");
COMMANDS.add(EXIT_STACK_TRACE + "");
+ COMMANDS.add(INSTRUMENT_IMPLEMENTORS + "");
}
}
diff --git a/org.intrace/testsrc/example/InstrumentMe.java b/org.intrace/testsrc/example/InstrumentMe.java
new file mode 100644
index 0000000..3b33597
--- /dev/null
+++ b/org.intrace/testsrc/example/InstrumentMe.java
@@ -0,0 +1,20 @@
+package example;
+
+import java.util.Arrays;
+
+public class InstrumentMe implements Runnable
+{
+ private byte myField = 1;
+
+ @Override
+ public void run()
+ {
+ byteArg((byte) 0);
+ }
+
+ private void byteArg(byte arg)
+ {
+ this.myField = arg;
+ }
+
+}
diff --git a/org.intrace/testsrc/example/InstrumentMeLaunch.java b/org.intrace/testsrc/example/InstrumentMeLaunch.java
new file mode 100644
index 0000000..a911c49
--- /dev/null
+++ b/org.intrace/testsrc/example/InstrumentMeLaunch.java
@@ -0,0 +1,27 @@
+package example;
+
+public class InstrumentMeLaunch
+{
+ public static void main(String args[]) throws Exception {
+ System.out.println("Currently running sample code in background thread.");
+ System.out.println("Make sure this program has -javaagent:./path/to/intrace-agent.jar on its command line.");
+ System.out.println("Start InTrace GUI, download-able at https://mchr3k.github.io/org.intrace/");
+ System.out.println("'Connect' & then configure GUI to trace any of these patterns:\n\n");
+ System.out.println("example.InstrumentMe -- to trace all methods in class example.InstrumentMe");
+ System.out.println("example.InstrumentMe -- to trace all methods in class example.InstrumentMeLaunch");
+ System.out.println("example.InstrumentMe#()V -- to trace this single method.");
+ System.out.println("example.InstrumentMe#run()V -- to trace this single method.");
+ System.out.println("example.InstrumentMe#byteArg(B)V -- to trace this single method.");
+ System.out.println("example.InstrumentMeLaunch#()V -- to trace this single method.");
+ System.out.println("example.InstrumentMeLaunch#main([Ljava/lang/String;)V -- to trace this single method.\n\n");
+
+ System.out.println("Press Ctrl+C to quit this program.");
+ Runnable r = new InstrumentMe();
+ while(true) {
+ System.out.println("About to start thread.");
+ new Thread(r).start();
+ Thread.sleep(2000);
+
+ }
+ }
+}
diff --git a/org.intrace/testsrc/org/intracetest/agent/AgentSettingsTest.java b/org.intrace/testsrc/org/intracetest/agent/AgentSettingsTest.java
index 420e77e..bc8e8aa 100644
--- a/org.intrace/testsrc/org/intracetest/agent/AgentSettingsTest.java
+++ b/org.intrace/testsrc/org/intracetest/agent/AgentSettingsTest.java
@@ -64,6 +64,25 @@ public class AgentSettingsTest extends TestCase
assertEquals(settingsMap.get(AgentConfigConstants.VERBOSE_MODE), "true");
}
+ public void testInstrumentImplementorsSetting() {
+ AgentSettings as1 = new AgentSettings(
+ AgentConfigConstants.INSTRUMENT_IMPLEMENTORS
+ + "true"
+ );
+ assertTrue( "unable to recognize parameter that instruments implementors of interfaces", as1.instrumentImplementors() );
+
+ AgentSettings as2 = new AgentSettings(
+ AgentConfigConstants.INSTRUMENT_IMPLEMENTORS
+ + "false"
+ );
+ assertFalse( "unable to recognize parameter that instruments implementors of interfaces",as2.instrumentImplementors() );
+
+ AgentSettings as3 = new AgentSettings("");
+ assertFalse( "unable to recognize parameter that instruments implementors of interfaces", as3.instrumentImplementors() );
+
+
+ }
+
public void testInstrCriteria() {
InstrCriteria ic = new InstrCriteria("foo|bar");