Permalink
Show file tree
Hide file tree
1 comment
on commit
sign in to comment.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
8274944: AppCDS dump causes SEGV in VM thread while adjusting lambda …
…proxy class info Reviewed-by: minqi, dholmes
- Loading branch information
1 parent
82f4aac
commit e5cd2692da6327c6fde954f86595a08fe5edf43f
Showing
9 changed files
with
248 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,78 @@ | ||
/* | ||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. | ||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
* | ||
* This code is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 only, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This code is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
* version 2 for more details (a copy is included in the LICENSE file that | ||
* accompanied this code). | ||
* | ||
* You should have received a copy of the GNU General Public License version | ||
* 2 along with this work; if not, write to the Free Software Foundation, | ||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
* | ||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
* or visit www.oracle.com if you need additional information or have any | ||
* questions. | ||
* | ||
*/ | ||
|
||
/* | ||
* @test | ||
* @bug 8274944 | ||
* @summary VM should not crash during CDS dump when a lambda proxy class | ||
* contains an old version of interface. | ||
* @requires vm.cds | ||
* @library /test/lib | ||
* @compile test-classes/OldProvider.jasm | ||
* @compile test-classes/LambdaContainsOldInfApp.java | ||
* @run driver LambdaContainsOldInf | ||
*/ | ||
|
||
import jdk.test.lib.cds.CDSOptions; | ||
import jdk.test.lib.cds.CDSTestUtils; | ||
import jdk.test.lib.process.OutputAnalyzer; | ||
|
||
public class LambdaContainsOldInf { | ||
|
||
public static void main(String[] args) throws Exception { | ||
String mainClass = "LambdaContainsOldInfApp"; | ||
String namePrefix = "lambdacontainsoldinf"; | ||
JarBuilder.build(namePrefix, mainClass, "OldProvider"); | ||
|
||
String appJar = TestCommon.getTestJar(namePrefix + ".jar"); | ||
String classList = namePrefix + ".list"; | ||
String archiveName = namePrefix + ".jsa"; | ||
|
||
// dump class list | ||
CDSTestUtils.dumpClassList(classList, "-cp", appJar, mainClass); | ||
|
||
// create archive with the class list | ||
CDSOptions opts = (new CDSOptions()) | ||
.addPrefix("-XX:ExtraSharedClassListFile=" + classList, | ||
"-cp", appJar, | ||
"-Xlog:class+load,cds") | ||
.setArchiveName(archiveName); | ||
OutputAnalyzer output = CDSTestUtils.createArchiveAndCheck(opts); | ||
TestCommon.checkExecReturn(output, 0, true, | ||
"Skipping OldProvider: Old class has been linked"); | ||
output.shouldMatch("Skipping.LambdaContainsOldInfApp[$][$]Lambda[$].*0x.*:.*Old.class.has.been.linked"); | ||
|
||
// run with archive | ||
CDSOptions runOpts = (new CDSOptions()) | ||
.addPrefix("-cp", appJar, "-Xlog:class+load,cds=debug") | ||
.setArchiveName(archiveName) | ||
.setUseVersion(false) | ||
.addSuffix(mainClass); | ||
output = CDSTestUtils.runWithArchive(runOpts); | ||
TestCommon.checkExecReturn(output, 0, true, | ||
"[class,load] LambdaContainsOldInfApp source: shared objects file"); | ||
output.shouldMatch(".class.load. OldProvider.source:.*lambdacontainsoldinf.jar") | ||
.shouldMatch(".class.load. LambdaContainsOldInfApp[$][$]Lambda[$].*/0x.*source:.*LambdaContainsOldInf"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,81 @@ | ||
/* | ||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. | ||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
* | ||
* This code is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 only, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This code is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
* version 2 for more details (a copy is included in the LICENSE file that | ||
* accompanied this code). | ||
* | ||
* You should have received a copy of the GNU General Public License version | ||
* 2 along with this work; if not, write to the Free Software Foundation, | ||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
* | ||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
* or visit www.oracle.com if you need additional information or have any | ||
* questions. | ||
* | ||
*/ | ||
|
||
/* | ||
* @test | ||
* @bug 8274944 | ||
* @summary VM should not crash during CDS dump when a lambda proxy class | ||
* contains an old version of interface. | ||
* @requires vm.cds | ||
* @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds | ||
* /test/hotspot/jtreg/runtime/cds/appcds/test-classes | ||
* /test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/test-classes | ||
* @build LambdaContainsOldInfApp sun.hotspot.WhiteBox OldProvider LambdaVerification | ||
* @run driver jdk.test.lib.helpers.ClassFileInstaller -jar lambda_contains_old_inf.jar LambdaVerification | ||
* LambdaContainsOldInfApp OldProvider | ||
* @run driver jdk.test.lib.helpers.ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox | ||
* @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox | ||
* @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. LambdaContainsOldInf | ||
*/ | ||
|
||
import jdk.test.lib.helpers.ClassFileInstaller; | ||
|
||
public class LambdaContainsOldInf extends DynamicArchiveTestBase { | ||
public static void main(String[] args) throws Exception { | ||
runTest(LambdaContainsOldInf::test); | ||
} | ||
|
||
static void test() throws Exception { | ||
String topArchiveName = getNewArchiveName(); | ||
String appJar = ClassFileInstaller.getJarPath("lambda_contains_old_inf.jar"); | ||
String mainClass = "LambdaContainsOldInfApp"; | ||
String wbJar = ClassFileInstaller.getJarPath("WhiteBox.jar"); | ||
String use_whitebox_jar = "-Xbootclasspath/a:" + wbJar; | ||
|
||
dump(topArchiveName, | ||
"-XX:+UnlockDiagnosticVMOptions", | ||
"-XX:+WhiteBoxAPI", | ||
"-Xlog:class+load=debug,cds=debug,cds+dynamic=info", | ||
use_whitebox_jar, | ||
"-cp", appJar, mainClass) | ||
.assertNormalExit(output -> { | ||
output.shouldContain("Skipping OldProvider: Old class has been linked") | ||
.shouldMatch("Skipping.LambdaContainsOldInfApp[$][$]Lambda[$].*0x.*:.*Old.class.has.been.linked") | ||
.shouldHaveExitValue(0); | ||
}); | ||
|
||
run(topArchiveName, | ||
"-XX:+UnlockDiagnosticVMOptions", | ||
"-XX:+WhiteBoxAPI", | ||
use_whitebox_jar, | ||
"-Xlog:class+load=debug", | ||
"-cp", appJar, mainClass) | ||
.assertNormalExit(output -> { | ||
output.shouldContain("[class,load] LambdaContainsOldInfApp source: shared objects file (top)") | ||
.shouldMatch(".class.load. OldProvider.source:.*lambda_contains_old_inf.jar") | ||
.shouldMatch(".class.load. LambdaContainsOldInfApp[$][$]Lambda[$].*/0x.*source:.*LambdaContainsOldInf") | ||
.shouldHaveExitValue(0); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,34 @@ | ||
/* | ||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. | ||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
* | ||
* This code is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 only, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This code is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
* version 2 for more details (a copy is included in the LICENSE file that | ||
* accompanied this code). | ||
* | ||
* You should have received a copy of the GNU General Public License version | ||
* 2 along with this work; if not, write to the Free Software Foundation, | ||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
* | ||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
* or visit www.oracle.com if you need additional information or have any | ||
* questions. | ||
* | ||
*/ | ||
public class LambdaContainsOldInfApp { | ||
public static void main(final String... args) { | ||
getProvider(); | ||
} | ||
|
||
public static OldProvider getProvider() { | ||
return () -> { | ||
return null; | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,29 @@ | ||
/* | ||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. | ||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
* | ||
* This code is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 only, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This code is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
* version 2 for more details (a copy is included in the LICENSE file that | ||
* accompanied this code). | ||
* | ||
* You should have received a copy of the GNU General Public License version | ||
* 2 along with this work; if not, write to the Free Software Foundation, | ||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
* | ||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
* or visit www.oracle.com if you need additional information or have any | ||
* questions. | ||
* | ||
*/ | ||
public interface OldProvider | ||
version 49:0 | ||
{ | ||
public abstract Method get:"()Ljava/lang/Object;"; | ||
|
||
} // end Class OldProvider |
e5cd269
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review
Issues