Bug 534037 - disable class instrumentation on unsupported JREs
Also cleaned up other messages produced by the javaagent
Change-Id: I4e54f3d4fee90568c299e624035edfea79aa6d5b
Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
diff --git a/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java b/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java
index e286992..d4546a5 100644
--- a/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java
+++ b/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.jdt.launching.internal.javaagent;
+import java.io.InputStream;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
@@ -18,12 +19,33 @@
import java.security.ProtectionDomain;
import org.eclipse.jdt.launching.internal.weaving.ClassfileTransformer;
+import org.objectweb.asm.ClassReader;
public class Premain {
private static final ClassfileTransformer transformer = new ClassfileTransformer();
- public static void premain(@SuppressWarnings("unused") String agentArgs, Instrumentation inst) {
- // System.err.println("Advanced source lookup support loaded."); //$NON-NLS-1$
+ public static void premain(final String agentArgs, final Instrumentation inst) {
+ final boolean debuglog = "debuglog".equals(agentArgs); //$NON-NLS-1$
+
+ // disable instrumentation if ASM is not able to read Object.class definition
+ try {
+ InputStream is = ClassLoader.getSystemResourceAsStream("java/lang/Object.class"); //$NON-NLS-1$
+ try {
+ new ClassReader(is);
+ }
+ finally {
+ is.close();
+ }
+ }
+ catch (Exception e) {
+ String vendor = System.getProperty("java.vendor"); //$NON-NLS-1$
+ String version = System.getProperty("java.version"); //$NON-NLS-1$
+ System.err.printf("JRE %s/%s is not supported, advanced source lookup disabled: %s.\n", vendor, version, e.getMessage()); //$NON-NLS-1$
+ if (debuglog) {
+ e.printStackTrace(System.err);
+ }
+ return;
+ }
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, final String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
@@ -51,11 +73,17 @@
return transformer.transform(classfileBuffer, location);
}
catch (Exception e) {
- System.err.print("Could not instrument class " + className + ": "); //$NON-NLS-1$ //$NON-NLS-2$
- e.printStackTrace(System.err);
+ System.err.printf("Could not instrument class %s: %s.\n", className, e.getMessage()); //$NON-NLS-1$
+ if (debuglog) {
+ e.printStackTrace(System.err);
+ }
}
return null;
}
});
+
+ if (debuglog) {
+ System.err.println("Advanced source lookup enabled."); //$NON-NLS-1$
+ }
}
}
diff --git a/org.eclipse.jdt.launching/lib/javaagent-shaded.jar b/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
index 43df9bf..fc80401 100644
--- a/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
+++ b/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
Binary files differ