test/jdk/com/sun/jdi/lib/jdb/Debuggee.java
author coleenp
Fri, 19 Apr 2019 21:49:54 -0700
changeset 54585 3452d108d06d
parent 52291 fa61165a3f2b
permissions -rw-r--r--
8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition Summary: Introduce new flag fo compatibility: -XX:AllowRedefinitionToAddOrDeleteMethods Reviewed-by: jcbeyler, sspitsyn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52291
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     1
/*
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
52291
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     4
 *
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     8
 *
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    13
 * accompanied this code).
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    14
 *
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    18
 *
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    21
 * questions.
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    22
 */
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    23
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    24
package lib.jdb;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    25
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    26
import jdk.test.lib.Utils;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    27
import jdk.test.lib.process.ProcessTools;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    28
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    29
import java.io.Closeable;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    30
import java.io.IOException;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    31
import java.util.LinkedList;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    32
import java.util.List;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    33
import java.util.concurrent.TimeUnit;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    34
import java.util.concurrent.TimeoutException;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    35
import java.util.regex.Matcher;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    36
import java.util.regex.Pattern;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    37
import java.util.stream.Collectors;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    38
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    39
/**
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    40
 * Helper class to run java debuggee and parse agent listening transport/address.
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    41
 * Usage:
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    42
 *   1)
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    43
 *      Debugee debugee = Debuggee.launcher("MyClass").setTransport("dt_shmem").launch();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    44
 *      try {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    45
 *          String transport = debuggee.getTransport();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    46
 *          String addr = debuggee.getAddress();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    47
 *      } finally {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    48
 *          debuggee.shutdown();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    49
 *      }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    50
 *   2) (using try-with-resource)
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    51
 *      try (Debugee debugee = Debuggee.launcher("MyClass").launch()) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    52
 *          String transport = debuggee.getTransport();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    53
 *          String addr = debuggee.getAddress();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    54
 *      }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    55
 *   3)
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    56
 *      ProcessBuilder pb = Debuggee.launcher("MyClass").setSuspended(false).prepare();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    57
 *      ProcessTools.executeProcess(pb);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    58
 */
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    59
public class Debuggee implements Closeable {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    60
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    61
    public static Launcher launcher(String mainClass) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    62
        return new Launcher(mainClass);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    63
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    64
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    65
    public static class Launcher {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    66
        private final String mainClass;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    67
        private final List<String> options = new LinkedList<>();
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
    68
        private String vmOptions = null;
52291
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    69
        private String transport = "dt_socket";
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    70
        private String address = null;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    71
        private boolean suspended = true;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    72
        private boolean addTestVmAndJavaOptions = true;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    73
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    74
        private Launcher(String mainClass) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    75
            this.mainClass = mainClass;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    76
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    77
        public Launcher addOption(String option) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    78
            options.add(option);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    79
            return this;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    80
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    81
        public Launcher addOptions(List<String> options) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    82
            this.options.addAll(options);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    83
            return this;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    84
        }
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
    85
        public Launcher addVMOptions(String vmOptions) {
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
    86
            this.vmOptions = vmOptions;
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
    87
            return this;
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
    88
        }
52291
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    89
        // default is "dt_socket"
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    90
        public Launcher setTransport(String value) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    91
            transport = value;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    92
            return this;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    93
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    94
        // default is "null" (auto-generate)
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    95
        public Launcher setAddress(String value) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    96
            address = value;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    97
            return this;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    98
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
    99
        // default is "true"
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   100
        public Launcher setSuspended(boolean value) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   101
            suspended = value;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   102
            return this;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   103
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   104
        // default is "true"
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   105
        public Launcher addTestVmAndJavaOptions(boolean value) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   106
            addTestVmAndJavaOptions = value;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   107
            return this;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   108
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   109
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   110
        public ProcessBuilder prepare() {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   111
            List<String> debuggeeArgs = new LinkedList<>();
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
   112
            if (vmOptions != null) {
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
   113
                debuggeeArgs.add(vmOptions);
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents: 52291
diff changeset
   114
            }
52291
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   115
            debuggeeArgs.add("-agentlib:jdwp=transport=" + transport
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   116
                    + (address == null ? "" : ",address=" + address)
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   117
                    + ",server=y,suspend=" + (suspended ? "y" : "n"));
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   118
            debuggeeArgs.addAll(options);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   119
            debuggeeArgs.add(mainClass);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   120
            return ProcessTools.createJavaProcessBuilder(addTestVmAndJavaOptions,
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   121
                    debuggeeArgs.toArray(new String[0]));
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   122
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   123
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   124
        public Debuggee launch(String name) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   125
            return new Debuggee(prepare(), name);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   126
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   127
        public Debuggee launch() {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   128
            return launch("debuggee");
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   129
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   130
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   131
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   132
    // starts the process, waits for "Listening for transport" output and detects transport/address
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   133
    private Debuggee(ProcessBuilder pb, String name) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   134
        // debuggeeListen[0] - transport, debuggeeListen[1] - address
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   135
        String[] debuggeeListen = new String[2];
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   136
        Pattern listenRegexp = Pattern.compile("Listening for transport \\b(.+)\\b at address: \\b(.+)\\b");
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   137
        try {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   138
            p = ProcessTools.startProcess(name, pb,
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   139
                    s -> output.add(s),  // output consumer
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   140
                    s -> {  // warm-up predicate
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   141
                        Matcher m = listenRegexp.matcher(s);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   142
                        if (!m.matches()) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   143
                            return false;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   144
                        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   145
                        debuggeeListen[0] = m.group(1);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   146
                        debuggeeListen[1] = m.group(2);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   147
                        return true;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   148
                    },
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   149
                    30, TimeUnit.SECONDS);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   150
            transport = debuggeeListen[0];
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   151
            address = debuggeeListen[1];
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   152
        } catch (IOException | InterruptedException | TimeoutException ex) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   153
            throw new RuntimeException("failed to launch debuggee", ex);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   154
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   155
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   156
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   157
    private final Process p;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   158
    private final List<String> output = new LinkedList<>();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   159
    private final String transport;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   160
    private final String address;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   161
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   162
    public void shutdown() {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   163
        try {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   164
            close();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   165
        } catch (IOException ex) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   166
            // ignore
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   167
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   168
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   169
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   170
    // waits until the process shutdown or crash
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   171
    public boolean waitFor(long timeout, TimeUnit unit) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   172
        try {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   173
            return p.waitFor(Utils.adjustTimeout(timeout), unit);
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   174
        } catch (InterruptedException e) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   175
            return false;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   176
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   177
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   178
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   179
    // returns the whole debuggee output as a string
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   180
    public String getOutput() {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   181
        return output.stream().collect(Collectors.joining(Utils.NEW_LINE));
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   182
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   183
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   184
    String getTransport() {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   185
        return transport;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   186
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   187
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   188
    public String getAddress() {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   189
        return address;
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   190
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   191
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   192
    @Override
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   193
    public void close() throws IOException {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   194
        if (p.isAlive()) {
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   195
            p.destroy();
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   196
        }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   197
    }
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   198
fa61165a3f2b 8212151: jdi/ExclusiveBind.java times out due to "bind failed: Address already in use" on Solaris-X64
amenkov
parents:
diff changeset
   199
}