diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/Reference.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/Reference.java index dd18d88d9e..e288d87fa3 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/Reference.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/Reference.java @@ -102,6 +102,11 @@ public class Reference { return merged; } + @Override + public String toString() { + return "Reference<" + className + ">"; + } + public static class Source { private final String name; private final int line; @@ -193,16 +198,25 @@ public class Reference { /** Fallback mismatch in case an unexpected exception occurs during reference checking. */ public static class ReferenceCheckError extends Mismatch { private final Exception referenceCheckExcetpion; + private final Reference referenceBeingChecked; + private final ClassLoader classLoaderBeingChecked; - public ReferenceCheckError(Exception e) { + public ReferenceCheckError( + Exception e, Reference referenceBeingChecked, ClassLoader classLoaderBeingChecked) { super(new Source[0]); this.referenceCheckExcetpion = e; + this.referenceBeingChecked = referenceBeingChecked; + this.classLoaderBeingChecked = classLoaderBeingChecked; } @Override String getMismatchDetails() { final StringWriter sw = new StringWriter(); - sw.write("Failed to generate reference check: "); + sw.write("Failed to generate reference check for: "); + sw.write(referenceBeingChecked.toString()); + sw.write(" on classloader "); + sw.write(classLoaderBeingChecked.toString()); + sw.write("\n"); // add exception message and stack trace final PrintWriter pw = new PrintWriter(sw); referenceCheckExcetpion.printStackTrace(pw); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java index dcccbecd17..13b093fd33 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java @@ -101,7 +101,7 @@ public class ReferenceMatcher { } } catch (Exception e) { // Shouldn't happen. Fail the reference check and add a mismatch for debug logging. - mismatches.add(new Mismatch.ReferenceCheckError(e)); + mismatches.add(new Mismatch.ReferenceCheckError(e, reference, loader)); } return mismatches; } @@ -134,6 +134,12 @@ public class ReferenceMatcher { private final List fields = new ArrayList<>(); public static UnloadedType of(String className, ClassLoader classLoader) throws Exception { + if (classLoader != Utils.getBootstrapProxy()) { + // getResource delegation won't see our bootstrap classes so do the delegation here. + if (Utils.getBootstrapProxy().getResource(Utils.getResourceName(className)) != null) { + return of(className, Utils.getBootstrapProxy()); + } + } className = Utils.getInternalName(className); Map classLoaderCache = typeCache.get(classLoader); if (classLoaderCache == null) {