Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java
41161 views
/*1* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223package nsk.share.jdb;2425import nsk.share.*;26import nsk.share.jpda.*;27import nsk.share.jdi.ArgumentHandler;2829import java.io.*;30import java.util.*;3132/**33* This class provides launching of <code>jdb</code> and debuggee in local34* or remote mode according to test command line options.35*/3637public class Launcher extends DebugeeBinder {3839/* Delay in milliseconds after launching jdb.*/40static final long DEBUGGEE_START_DELAY = 5 * 1000;4142protected static Jdb jdb;4344protected static Debuggee debuggee;4546/** Pattern for message of jdb has started. */47protected static String JDB_STARTED = "Initializing jdb";4849/**50* Get version string.51*/52public static String getVersion () {53return "@(#)Launcher.java %I% %E%";54}5556// -------------------------------------------------- //5758/**59* Handler of command line arguments.60*/61protected static JdbArgumentHandler argumentHandler = null;6263/**64* Return <code>argumentHandler</code> of this binder.65*/66public static JdbArgumentHandler getJdbArgumentHandler() {67return argumentHandler;68}6970/**71* Return <code>jdb</code> mirror of this binder.72*/73public static Jdb getJdb() {74return jdb;75}7677/**78* Return debuggee mirror of this binder.79*/80public static Debuggee getDebuggee() {81return debuggee;82}8384/**85* Incarnate new Launcher obeying the given86* <code>argumentHandler</code>; and assign the given87* <code>log</code>.88*/89public Launcher (JdbArgumentHandler argumentHandler, Log log) {90super(argumentHandler, log);91setLogPrefix("launcher > ");92this.argumentHandler = argumentHandler;93}9495/**96* Defines mode (local or remote) and type of connector (default, launching,97* raw launching, attaching or listening) according to options98* parsed by <code>JdbArgumentHandler</code>. And then launches <code>jdb</code>99* and debuggee in defined mode.100*/101public void launchJdbAndDebuggee (String classToExecute) throws IOException {102103String[] jdbCmdArgs = makeJdbCmdLine(classToExecute);104105if (argumentHandler.isLaunchedLocally()) {106107if (argumentHandler.isDefaultConnector()) {108109localDefaultLaunch(jdbCmdArgs, classToExecute);110111} else if (argumentHandler.isRawLaunchingConnector()) {112113localRawLaunch(jdbCmdArgs, classToExecute);114115} else if (argumentHandler.isLaunchingConnector()) {116117localLaunch(jdbCmdArgs, classToExecute);118119} else if (argumentHandler.isAttachingConnector()) {120121localLaunchAndAttach(jdbCmdArgs, classToExecute);122123} else if (argumentHandler.isListeningConnector()) {124125localLaunchAndListen(jdbCmdArgs, classToExecute);126127} else {128throw new TestBug("Unexpected connector type for local launch mode"129+ argumentHandler.getConnectorType());130}131132} else if (argumentHandler.isLaunchedRemotely()) {133134connectToBindServer(classToExecute);135136if (argumentHandler.isAttachingConnector()) {137138remoteLaunchAndAttach(jdbCmdArgs, classToExecute);139140} else if (argumentHandler.isListeningConnector()) {141142remoteLaunchAndListen(jdbCmdArgs, classToExecute);143144} else {145throw new TestBug("Unexpected connector type for remote launch mode"146+ argumentHandler.getConnectorType());147}148} else {149throw new Failure("Unexpected launching mode: " + argumentHandler.getLaunchMode());150}151}152153/**154* Creates String array to launch <code>jdb</code> according to options155* parsed by <code>JdbArgumentHandler</code>.156*/157private String[] makeJdbCmdLine (String classToExecute) {158159Vector<String> args = new Vector<String>();160161String jdbExecPath = argumentHandler.getJdbExecPath();162args.add(jdbExecPath.trim());163args.addAll(argumentHandler.enwrapJavaOptions(argumentHandler.getJavaOptions()));164165String jdbOptions = argumentHandler.getJdbOptions();166if (jdbOptions.trim().length() > 0) {167StringTokenizer tokenizer = new StringTokenizer(jdbOptions);168while (tokenizer.hasMoreTokens()) {169String option = tokenizer.nextToken();170args.add(option);171}172}173if (classToExecute == null)174return args.toArray(new String[args.size()]);175args.add("-connect");176StringBuffer connect = new StringBuffer();177178if (argumentHandler.isLaunchingConnector()) {179180// Do not need to use quote symbol.181// String quote = '\"';182// connect.append(quote + argumentHandler.getConnectorName() + ":");183connect.append(argumentHandler.getConnectorName() + ":");184185String connectorAddress;186String vmAddress = makeTransportAddress();;187188if (argumentHandler.isRawLaunchingConnector()) {189190if (argumentHandler.isSocketTransport()) {191if (argumentHandler.isLaunchedLocally()) {192connectorAddress = argumentHandler.getTransportPort();193} else {194connectorAddress = argumentHandler.getDebugeeHost() + ":" + argumentHandler.getTransportPort();195}196} else if (argumentHandler.isShmemTransport() ) {197connectorAddress = argumentHandler.getTransportSharedName();198} else {199throw new TestBug("Launcher: Undefined transport type for RawLaunchingConnector");200}201202connect.append("address=" + connectorAddress.trim());203connect.append(",command=" + makeCommandLineString(classToExecute, vmAddress, " ").trim());204205} else /* LaunchingConnector or DefaultConnector */ {206207connect.append("vmexec=" + argumentHandler.getLaunchExecName().trim());208String debuggeeOpts = argumentHandler.getDebuggeeOptions();209if (debuggeeOpts.trim().length() > 0) {210//connect.append(",options=" + debuggeeOpts.trim());211connect.append(",options=");212for (String arg : debuggeeOpts.split("\\s+")) {213connect.append(" \"");214connect.append(arg);215connect.append("\"");216}217}218String cmdline = classToExecute + " " + ArgumentHandler.joinArguments(argumentHandler.getArguments(), " ");219connect.append(",main=" + cmdline.trim());220221}222223// connect.append(quote);224225} else {226227connect.append(argumentHandler.getConnectorName() + ":");228229if (argumentHandler.isAttachingConnector()) {230231if (argumentHandler.isSocketTransport()) {232connect.append("port=" + argumentHandler.getTransportPort().trim());233if (argumentHandler.isLaunchedRemotely())234connect.append(",hostname=" + argumentHandler.getDebugeeHost().trim());235} else if (argumentHandler.isShmemTransport()) {236connect.append("name=" + argumentHandler.getTransportSharedName().trim());237} else {238throw new TestBug("Launcher: Undefined transport type for AttachingConnector");239}240241242} else if (argumentHandler.isListeningConnector()) {243244if (!argumentHandler.isTransportAddressDynamic()) {245if (argumentHandler.isSocketTransport()) {246connect.append("port=" + argumentHandler.getTransportPort().trim());247} else if (argumentHandler.isShmemTransport()) {248connect.append("name=" + argumentHandler.getTransportSharedName().trim());249} else {250throw new TestBug("Launcher: Undefined transport type for AttachingConnector");251}252}253254} else {255throw new TestBug("Launcher: Undefined connector type");256}257258}259260args.add(connect.toString().trim());261262String[] argsArray = new String[args.size()];263for (int i = 0; i < args.size(); i++) {264argsArray[i] = (String) args.elementAt(i);265}266267return argsArray;268}269270// ---------------------------------------------- //271272/**273* Run test in local mode using default connector.274*/275private void localDefaultLaunch276(String[] jdbCmdArgs, String classToExecute) throws IOException {277localLaunch(jdbCmdArgs, classToExecute);278}279280/**281* Run test in local mode using raw launching connector.282*/283private void localRawLaunch284(String[] jdbCmdArgs, String classToExecute) throws IOException {285localLaunch(jdbCmdArgs, classToExecute);286}287288/**289* Run test in local mode using launching connector.290*/291private void localLaunch292(String[] jdbCmdArgs, String classToExecute) throws IOException {293294jdb = new Jdb(this);295display("Starting jdb launching local debuggee");296jdb.launch(jdbCmdArgs);297298if (classToExecute != null)299jdb.waitForMessage(0, JDB_STARTED);300// jdb.waitForPrompt(0, false);301302}303304/**305* Run test in local mode using attaching connector.306*/307private void localLaunchAndAttach308(String[] jdbCmdArgs, String classToExecute) throws IOException {309310debuggee = new LocalLaunchedDebuggee(this);311String address = makeTransportAddress();312String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address);313debuggee.launch(javaCmdArgs);314315display("Start jdb attaching to local debuggee");316jdb = Jdb.startAttachingJdb (this, jdbCmdArgs, JDB_STARTED);317// jdb.waitForPrompt(0, false);318}319320/**321* Run test in local mode using listening connector.322*/323private void localLaunchAndListen324(String[] jdbCmdArgs, String classToExecute) throws IOException {325326jdb = new Jdb(this);327display("Starting jdb listening to local debuggee");328jdb.launch(jdbCmdArgs);329String address = jdb.waitForListeningJdb();330display("Listening address found: " + address);331332debuggee = new LocalLaunchedDebuggee(this);333String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address);334debuggee.launch(javaCmdArgs);335336// jdb.waitForPrompt(0, false);337}338339/**340* Run test in remote mode using attaching connector.341*/342private void remoteLaunchAndAttach343(String[] jdbCmdArgs, String classToExecute) throws IOException {344345debuggee = new RemoteLaunchedDebuggee(this);346String address = makeTransportAddress();347String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address);348try {349debuggee.launch(javaCmdArgs);350} catch (IOException e) {351throw new Failure("Caught exception while launching debuggee VM process:\n\t"352+ e);353};354355display("Start jdb attaching to remote debuggee");356jdb = Jdb.startAttachingJdb (this, jdbCmdArgs, JDB_STARTED);357// jdb.waitForPrompt(0, false);358}359360/**361* Run test in remote mode using listening connector.362*/363private void remoteLaunchAndListen364(String[] jdbCmdArgs, String classToExecute) throws IOException {365366jdb = new Jdb(this);367display("Starting jdb listening to remote debuggee");368jdb.launch(jdbCmdArgs);369String address = jdb.waitForListeningJdb();370display("Listening address found: " + address);371372debuggee = new RemoteLaunchedDebuggee(this);373String[] javaCmdArgs = makeCommandLineArgs(classToExecute);374try {375debuggee.launch(javaCmdArgs);376} catch (IOException e) {377throw new Failure("Caught exception while launching debuggee VM process:\n\t"378+ e);379};380381jdb.waitForMessage(0, JDB_STARTED);382// jdb.waitForPrompt(0, false);383}384385} // End of Launcher386387388