diff --git a/test/hotspot/jtreg/runtime/LoaderConstraints/differentLE/Test.java b/test/hotspot/jtreg/runtime/LoaderConstraints/differentLE/Test.java --- a/test/hotspot/jtreg/runtime/LoaderConstraints/differentLE/Test.java +++ b/test/hotspot/jtreg/runtime/LoaderConstraints/differentLE/Test.java @@ -31,7 +31,7 @@ * @library /test/lib * @compile D_ambgs.jasm * @run driver ClassFileInstaller test.D_ambgs - * @compile ../common/PreemptingClassLoader.java + * @compile -g ../common/PreemptingClassLoader.java * test/D_ambgs.java Test.java test/B.java * @run driver ClassFileInstaller test.B * @run main/othervm Test @@ -100,6 +100,7 @@ throw new RuntimeException("Expected LinkageError was not thrown."); } catch (LinkageError jle) { + printMessyStackTraces(jle); String errorMsg = jle.getMessage(); if (!errorMsg.contains(expectedErrorMessage_part1) || !errorMsg.contains(expectedErrorMessage_part2)) { @@ -115,4 +116,92 @@ public static void main(String[] args) throws Exception { test_access(); } + + /* Printouts of this method: + * + * java.lang.LinkageError: loader constraint violation: loader PreemptingClassLoader @694906c0 wants to load class test.D_ambgs. A different class with the same name was previously loaded by 'app'. (test.D_ambgs is in unnamed module of loader 'app') + * at java.base/java.lang.ClassLoader.defineClass1(Native Method) + * at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) + * at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877) + * at PreemptingClassLoader.loadClass(PreemptingClassLoader.java:61) + * at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) + * at test.B.gen(B.java:31) + * at test.D_ambgs.make(D_ambgs.java:41) + * at Test.test_access(Test.java:99) + * at Test.main(Test.java:117) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) + * at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + * at java.base/java.lang.reflect.Method.invoke(Method.java:564) + * at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) + * at java.base/java.lang.Thread.run(Thread.java:832) + * + * java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "o" is null + * at Test.printMessyStackTraces(Test.java:124) + * at Test.test_access(Test.java:103) + * at Test.main(Test.java:117) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) + * at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + * at java.base/java.lang.reflect.Method.invoke(Method.java:564) + * at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) + * at java.base/java.lang.Thread.run(Thread.java:832) + * + * + * Exceptions where stack trace does not point to problematic source code: + * + * java.lang.LinkageError: loader constraint violation: loader PreemptingClassLoader @694906c0 wants to load class test.D_ambgs. A different class with the same name was previously loaded by 'app'. (test.D_ambgs is in unnamed module of loader 'app') + * at Test.printMessyStackTraces(Test.java:124) + * at Test.test_access(Test.java:103) + * at Test.main(Test.java:117) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) + * at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + * at java.base/java.lang.reflect.Method.invoke(Method.java:564) + * at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) + * at java.base/java.lang.Thread.run(Thread.java:832) + * + * java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "o" is null + * at java.base/java.lang.ClassLoader.defineClass1(Native Method) + * at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) + * at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877) + * at PreemptingClassLoader.loadClass(PreemptingClassLoader.java:61) + * at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) + * at test.B.gen(B.java:31) + * at test.D_ambgs.make(D_ambgs.java:41) + * at Test.test_access(Test.java:99) + * at Test.main(Test.java:117) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + * at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) + * at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + * at java.base/java.lang.reflect.Method.invoke(Method.java:564) + * at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) + * at java.base/java.lang.Thread.run(Thread.java:832) + */ + static void printMessyStackTraces(Throwable le) { + Object o = null; + Exception npe = null; + try { + o.hashCode(); + } catch (NullPointerException e) { + npe = e; + } + + System.err.println("\nOriginal Exceptions:\n"); + le.printStackTrace(); + System.err.println(); + npe.printStackTrace(); + + // Mess with stack traces. + StackTraceElement[] leTrace = le.getStackTrace(); + le.setStackTrace(npe.getStackTrace()); + npe.setStackTrace(leTrace); + + System.err.println("\n\nExceptions where stack trace does not point to problematic source code:\n"); + le.printStackTrace(); + System.err.println(); + npe.printStackTrace(); + } + + }