--- old/test/jdk/com/sun/jdi/lib/jdb/JdbTest.java 2018-10-19 15:40:26.551030100 -0700 +++ new/test/jdk/com/sun/jdi/lib/jdb/JdbTest.java 2018-10-19 15:40:24.894597000 -0700 @@ -23,9 +23,7 @@ package lib.jdb; -import jdk.test.lib.Utils; import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.process.ProcessTools; import java.io.IOException; import java.nio.file.Files; @@ -34,9 +32,6 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; public abstract class JdbTest { @@ -76,8 +71,7 @@ } protected Jdb jdb; - protected Process debuggee; - private final List debuggeeOutput = new LinkedList<>(); + protected Debuggee debuggee; private final LaunchOptions launchOptions; // returns the whole jdb output as a string @@ -87,7 +81,7 @@ // returns the whole debuggee output as a string public String getDebuggeeOutput() { - return debuggeeOutput.stream().collect(Collectors.joining(lineSeparator)); + return debuggee == null ? "" : debuggee.getOutput(); } public void run() { @@ -106,45 +100,22 @@ protected void setup() { /* run debuggee as: - java -agentlib:jdwp=transport=dt_socket,address=0,server=n,suspend=y + java -agentlib:jdwp=transport=dt_socket,server=n,suspend=y it reports something like : Listening for transport dt_socket at address: 60810 after that connect jdb by: jdb -connect com.sun.jdi.SocketAttach:port=60810 */ // launch debuggee - List debuggeeArgs = new LinkedList<>(); - // specify address=0 to automatically select free port - debuggeeArgs.add("-agentlib:jdwp=transport=dt_socket,address=0,server=y,suspend=y"); - debuggeeArgs.addAll(launchOptions.debuggeeOptions); - debuggeeArgs.add(launchOptions.debuggeeClass); - ProcessBuilder pbDebuggee = ProcessTools.createJavaProcessBuilder(true, debuggeeArgs.toArray(new String[0])); - - // debuggeeListen[0] - transport, debuggeeListen[1] - address - String[] debuggeeListen = new String[2]; - Pattern listenRegexp = Pattern.compile("Listening for transport \\b(.+)\\b at address: \\b(\\d+)\\b"); - try { - debuggee = ProcessTools.startProcess("debuggee", pbDebuggee, - s -> debuggeeOutput.add(s), // output consumer - s -> { // warm-up predicate - Matcher m = listenRegexp.matcher(s); - if (!m.matches()) { - return false; - } - debuggeeListen[0] = m.group(1); - debuggeeListen[1] = m.group(2); - return true; - }, - 30, TimeUnit.SECONDS); - } catch (IOException | InterruptedException | TimeoutException ex) { - throw new RuntimeException("failed to launch debuggee", ex); - } + debuggee = Debuggee.launcher(launchOptions.debuggeeClass) + .addOptions(launchOptions.debuggeeOptions) + .launch(); // launch jdb try { - jdb = new Jdb("-connect", "com.sun.jdi.SocketAttach:port=" + debuggeeListen[1]); + jdb = new Jdb("-connect", "com.sun.jdi.SocketAttach:port=" + debuggee.getAddress()); } catch (Throwable ex) { // terminate debuggee if something went wrong - debuggee.destroy(); + debuggee.shutdown(); throw ex; } // wait while jdb is initialized @@ -158,15 +129,9 @@ jdb.shutdown(); } // shutdown debuggee - if (debuggee != null && debuggee.isAlive()) { - try { - debuggee.waitFor(Utils.adjustTimeout(10), TimeUnit.SECONDS); - } catch (InterruptedException e) { - // ignore - } finally { - if (debuggee.isAlive()) { - debuggee.destroy(); - } + if (debuggee != null) { + if (!debuggee.waitFor(10, TimeUnit.SECONDS)) { + debuggee.shutdown(); } } }