# HG changeset patch # User vtewari # Date 1475044136 -19800 # Node ID 64703e04389c57e886c6a1b94cd537f1fa40509c # Parent 4273117df541ade13bab0b71a4eb9320837202ee 8165537: runtime/SharedArchiveFile/SASymbolTableTest.java fails with NullPointerException Summary: Modify SASymbolTableTest.java to attach to LingeredApp and also handle the case where SymbolTable is not created. Reviewed-by: dsamersoff, mseledtsov, iklam Contributed-by: sharath.ballal@oracle.com diff -r 4273117df541 -r 64703e04389c hotspot/test/runtime/SharedArchiveFile/SASymbolTableTest.java --- a/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTest.java Tue Sep 27 20:55:13 2016 -0400 +++ b/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTest.java Wed Sep 28 11:58:56 2016 +0530 @@ -34,14 +34,17 @@ * jdk.hotspot.agent/sun.jvm.hotspot.runtime * jdk.hotspot.agent/sun.jvm.hotspot.tools * java.management - * @build SASymbolTableTestAgent SASymbolTableTestAttachee + * @build SASymbolTableTestAgent * @run main SASymbolTableTest */ +import java.util.Arrays; +import java.util.List; import jdk.test.lib.process.ProcessTools; import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.JDKToolFinder; import jdk.test.lib.Platform; +import jdk.test.lib.apps.LingeredApp; /* * The purpose of this test is to validate that we can use SA to @@ -53,6 +56,7 @@ */ public class SASymbolTableTest { static String jsaName = "./SASymbolTableTest.jsa"; + private static LingeredApp theApp = null; public static void main(String[] args) throws Exception { if (!Platform.shouldSAAttach()) { @@ -78,50 +82,44 @@ private static void run(boolean useArchive) throws Exception { String flag = useArchive ? "auto" : "off"; - // (1) Launch the attachee process - ProcessBuilder attachee = ProcessTools.createJavaProcessBuilder( - "-XX:+UnlockDiagnosticVMOptions", - "-XX:SharedArchiveFile=" + jsaName, - "-Xshare:" + flag, - "-showversion", // so we can see "sharing" in the output - "SASymbolTableTestAttachee"); + try { + // (1) Launch the attachee process + System.out.println("Starting LingeredApp"); + List vmOpts = Arrays.asList( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:SharedArchiveFile=" + jsaName, + "-Xshare:" + flag, + "-showversion"); // so we can see "sharing" in the output - final Process p = attachee.start(); + theApp = LingeredApp.startApp(vmOpts); - // (2) Launch the agent process - long pid = p.getPid(); - System.out.println("Attaching agent " + pid); - ProcessBuilder tool = ProcessTools.createJavaProcessBuilder( - "--add-modules=jdk.hotspot.agent", - "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED", - "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED", - "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED", - "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED", - "SASymbolTableTestAgent", - Long.toString(pid)); - OutputAnalyzer output = ProcessTools.executeProcess(tool); - System.out.println(output.getOutput()); - output.shouldHaveExitValue(0); - - Thread t = new Thread() { - public void run() { - try { - OutputAnalyzer output = new OutputAnalyzer(p); - System.out.println("STDOUT["); - System.out.print(output.getStdout()); - System.out.println("]"); - System.out.println("STDERR["); - System.out.print(output.getStderr()); - System.out.println("]"); - } catch (Throwable t) { - t.printStackTrace(); - } - } - }; - t.start(); - - Thread.sleep(2 * 1000); - p.destroy(); - t.join(); + // (2) Launch the agent process + long pid = theApp.getPid(); + System.out.println("Attaching agent to " + pid ); + ProcessBuilder tool = ProcessTools.createJavaProcessBuilder( + "--add-modules=jdk.hotspot.agent", + "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED", + "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED", + "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED", + "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED", + "SASymbolTableTestAgent", + Long.toString(pid)); + OutputAnalyzer output = ProcessTools.executeProcess(tool); + System.out.println("STDOUT["); + System.out.println(output.getOutput()); + if (output.getStdout().contains("connected too early")) { + System.out.println("SymbolTable not created by VM - test skipped"); + return; + } + System.out.println("]"); + System.out.println("STDERR["); + System.out.print(output.getStderr()); + System.out.println("]"); + output.shouldHaveExitValue(0); + } catch (Exception ex) { + throw new RuntimeException("Test ERROR " + ex, ex); + } finally { + LingeredApp.stopApp(theApp); + } } } diff -r 4273117df541 -r 64703e04389c hotspot/test/runtime/SharedArchiveFile/SASymbolTableTestAgent.java --- a/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTestAgent.java Tue Sep 27 20:55:13 2016 -0400 +++ b/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTestAgent.java Wed Sep 28 11:58:56 2016 +0530 @@ -112,31 +112,35 @@ public void run() { System.out.println("SASymbolTableTestAgent: starting"); - VM vm = VM.getVM(); - SymbolTable table = vm.getSymbolTable(); + try { + VM vm = VM.getVM(); + SymbolTable table = vm.getSymbolTable(); - // (a) These are names that are likely to exist in the symbol table - // of a JVM after start-up. They were taken from vmSymbols.hpp - // during the middle of JDK9 development. - // - // The purpose is not to check that each name must exist (a future - // version of JDK may not preload some of the classes). - // - // The purpose of this loops is to ensure that we check a lot of symbols, - // so we will (most likely) hit on both VALUE_ONLY_BUCKET_TYPE and normal bucket type - // in CompactHashTable.probe(). - for (String n : commonNames) { - Symbol s = table.probe(n); - System.out.format("%-40s = %s\n", n, s); - } + // (a) These are names that are likely to exist in the symbol table + // of a JVM after start-up. They were taken from vmSymbols.hpp + // during the middle of JDK9 development. + // + // The purpose is not to check that each name must exist (a future + // version of JDK may not preload some of the classes). + // + // The purpose of this loops is to ensure that we check a lot of symbols, + // so we will (most likely) hit on both VALUE_ONLY_BUCKET_TYPE and normal bucket type + // in CompactHashTable.probe(). + for (String n : commonNames) { + Symbol s = table.probe(n); + System.out.format("%-40s = %s\n", n, s); + } - System.out.println("======================================================================"); + System.out.println("======================================================================"); - // (b) Also test a few strings that are known to not exist in the table. This will - // both the compact table (if it exists) and the regular table to be walked. - for (String n : badNames) { - Symbol s = table.probe(n); - System.out.format("%-40s = %s\n", n, s); + // (b) Also test a few strings that are known to not exist in the table. This will + // both the compact table (if it exists) and the regular table to be walked. + for (String n : badNames) { + Symbol s = table.probe(n); + System.out.format("%-40s = %s\n", n, s); + } + } catch (NullPointerException e) { + System.out.println("connected too early -- please try again"); } } } diff -r 4273117df541 -r 64703e04389c hotspot/test/runtime/SharedArchiveFile/SASymbolTableTestAttachee.java --- a/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTestAttachee.java Tue Sep 27 20:55:13 2016 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2016, 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. - */ - -/** - * This class is launched in a sub-process by the main test, - * SASymbolTableTest.java. - * - * This class does nothing in particular. It just sleeps for 120 - * seconds so SASymbolTableTestAgent can have a chance to examine its - * SymbolTable. This process should be killed by the parent process - * after SASymbolTableTestAgent has completed testing. - */ -public class SASymbolTableTestAttachee { - public static void main(String args[]) throws Throwable { - System.out.println("SASymbolTableTestAttachee: sleeping to wait for SA tool to attach ..."); - Thread.sleep(120 * 1000); - } -}