--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java 2019-07-08 20:58:22.902816362 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java 2019-07-08 20:58:22.770815948 +0900 @@ -46,37 +46,59 @@ } private static boolean commonHelp(String mode) { + return commonHelp(mode, false); + } + + private static boolean commonHelpWithConnect(String mode) { + return commonHelp(mode, true); + } + + private static boolean commonHelp(String mode, boolean canConnectToRemote) { // --pid // --exe // --core - System.out.println(" --pid \tTo attach to and operate on the given live process."); - System.out.println(" --core \tTo operate on the given core file."); + // --connect [@] + System.out.println(" --pid To attach to and operate on the given live process."); + System.out.println(" --core To operate on the given core file."); System.out.println(" --exe "); + if (canConnectToRemote) { + System.out.println(" --connect [@] To connect to a remote debug server (debugd)."); + } System.out.println(); System.out.println(" The --core and --exe options must be set together to give the core"); - System.out.println(" file, and associated executable, to operate on. Otherwise the --pid"); - System.out.println(" option can be set to operate on a live process."); - System.out.println(" The arguments for --exe and --core can use absolute or relative paths."); + System.out.println(" file, and associated executable, to operate on. They can use"); + System.out.println(" absolute or relative paths."); + System.out.println(" The --pid option can be set to operate on a live process."); + if (canConnectToRemote) { + System.out.println(" The --connect option can be set to connect to a debug server (debugd)."); + System.out.println(" <--core --exe> and <--pid> and <--connect> are mutually exclusive."); + } else { + System.out.println(" <--core --exe> and <--pid> are mutually eexclusive."); + } System.out.println(); System.out.println(" Examples: jhsdb " + mode + " --pid 1234"); System.out.println(" or jhsdb " + mode + " --core ./core.1234 --exe ./myexe"); + if (canConnectToRemote) { + System.out.println(" or jhsdb " + mode + " --connect debugserver"); + System.out.println(" or jhsdb " + mode + " --connect id@debugserver"); + } return false; } private static boolean debugdHelp() { // [options] [server-id] // [options] [server-id] - System.out.println(" --serverid \tA unique identifier for this debug server."); + System.out.println(" --serverid A unique identifier for this debug server."); return commonHelp("debugd"); } private static boolean jinfoHelp() { // --flags -> -flags // --sysprops -> -sysprops - System.out.println(" --flags \tTo print VM flags."); - System.out.println(" --sysprops \tTo print Java System properties."); - System.out.println(" \tTo print both of the above."); - return commonHelp("jinfo"); + System.out.println(" --flags To print VM flags."); + System.out.println(" --sysprops To print Java System properties."); + System.out.println(" To print both of the above."); + return commonHelpWithConnect("jinfo"); } private static boolean jmapHelp() { @@ -86,27 +108,27 @@ // --clstats -> -clstats // --finalizerinfo -> -finalizerinfo - System.out.println(" \tTo print same info as Solaris pmap."); - System.out.println(" --heap \tTo print java heap summary."); - System.out.println(" --binaryheap \tTo dump java heap in hprof binary format."); - System.out.println(" --dumpfile \tThe name of the dump file."); - System.out.println(" --histo \tTo print histogram of java object heap."); - System.out.println(" --clstats \tTo print class loader statistics."); - System.out.println(" --finalizerinfo \tTo print information on objects awaiting finalization."); - return commonHelp("jmap"); + System.out.println(" To print same info as Solaris pmap."); + System.out.println(" --heap To print java heap summary."); + System.out.println(" --binaryheap To dump java heap in hprof binary format."); + System.out.println(" --dumpfile The name of the dump file."); + System.out.println(" --histo To print histogram of java object heap."); + System.out.println(" --clstats To print class loader statistics."); + System.out.println(" --finalizerinfo To print information on objects awaiting finalization."); + return commonHelpWithConnect("jmap"); } private static boolean jstackHelp() { // --locks -> -l // --mixed -> -m - System.out.println(" --locks \tTo print java.util.concurrent locks."); - System.out.println(" --mixed \tTo print both Java and native frames (mixed mode)."); - return commonHelp("jstack"); + System.out.println(" --locks To print java.util.concurrent locks."); + System.out.println(" --mixed To print both Java and native frames (mixed mode)."); + return commonHelpWithConnect("jstack"); } private static boolean jsnapHelp() { - System.out.println(" --all \tTo print all performance counters."); - return commonHelp("jsnap"); + System.out.println(" --all To print all performance counters."); + return commonHelpWithConnect("jsnap"); } private static boolean toolHelp(String toolName) { @@ -134,10 +156,12 @@ return launcherHelp(); } + private static final String NO_REMOTE = null; + private static void buildAttachArgs(ArrayList newArgs, String pid, - String exe, String core, boolean allowEmpty) { - if (!allowEmpty && (pid == null) && (exe == null)) { - throw new SAGetoptException("You have to set --pid or --exe."); + String exe, String core, String remote, boolean allowEmpty) { + if (!allowEmpty && (pid == null) && (exe == null) && (remote == NO_REMOTE)) { + throw new SAGetoptException("You have to set --pid or --exe or --connect."); } if (pid != null) { // Attach to live process @@ -145,13 +169,17 @@ throw new SAGetoptException("Unnecessary argument: --exe"); } else if (core != null) { throw new SAGetoptException("Unnecessary argument: --core"); + } else if (remote != NO_REMOTE) { + throw new SAGetoptException("Unnecessary argument: --connect"); } else if (!pid.matches("^\\d+$")) { throw new SAGetoptException("Invalid pid: " + pid); } newArgs.add(pid); } else if (exe != null) { - if (exe.length() == 0) { + if (remote != NO_REMOTE) { + throw new SAGetoptException("Unnecessary argument: --connect"); + } else if (exe.length() == 0) { throw new SAGetoptException("You have to set --exe."); } @@ -162,6 +190,8 @@ } newArgs.add(core); + } else if (remote != NO_REMOTE) { + newArgs.add(remote); } } @@ -190,7 +220,7 @@ } } - buildAttachArgs(newArgs, pid, exe, core, true); + buildAttachArgs(newArgs, pid, exe, core, NO_REMOTE, true); CLHSDB.main(newArgs.toArray(new String[newArgs.size()])); } @@ -219,19 +249,20 @@ } } - buildAttachArgs(newArgs, pid, exe, core, true); + buildAttachArgs(newArgs, pid, exe, core, NO_REMOTE, true); HSDB.main(newArgs.toArray(new String[newArgs.size()])); } private static void runJSTACK(String[] oldArgs) { SAGetopt sg = new SAGetopt(oldArgs); - String[] longOpts = {"exe=", "core=", "pid=", + String[] longOpts = {"exe=", "core=", "pid=", "connect=", "mixed", "locks"}; ArrayList newArgs = new ArrayList(); String pid = null; String exe = null; String core = null; + String remote = NO_REMOTE; String s = null; while((s = sg.next(null, longOpts)) != null) { @@ -247,6 +278,10 @@ pid = sg.getOptarg(); continue; } + if (s.equals("connect")) { + remote = sg.getOptarg(); + continue; + } if (s.equals("mixed")) { newArgs.add("-m"); continue; @@ -257,20 +292,21 @@ } } - buildAttachArgs(newArgs, pid, exe, core, false); + buildAttachArgs(newArgs, pid, exe, core, remote, false); JStack jstack = new JStack(false, false); jstack.runWithArgs(newArgs.toArray(new String[newArgs.size()])); } private static void runJMAP(String[] oldArgs) { SAGetopt sg = new SAGetopt(oldArgs); - String[] longOpts = {"exe=", "core=", "pid=", + String[] longOpts = {"exe=", "core=", "pid=", "connect=", "heap", "binaryheap", "dumpfile=", "histo", "clstats", "finalizerinfo"}; ArrayList newArgs = new ArrayList(); String pid = null; String exe = null; String core = null; + String remote = NO_REMOTE; String s = null; String dumpfile = null; boolean requestHeapdump = false; @@ -288,6 +324,10 @@ pid = sg.getOptarg(); continue; } + if (s.equals("connect")) { + remote = sg.getOptarg(); + continue; + } if (s.equals("heap")) { newArgs.add("-heap"); continue; @@ -325,19 +365,20 @@ } } - buildAttachArgs(newArgs, pid, exe, core, false); + buildAttachArgs(newArgs, pid, exe, core, remote, false); JMap.main(newArgs.toArray(new String[newArgs.size()])); } private static void runJINFO(String[] oldArgs) { SAGetopt sg = new SAGetopt(oldArgs); - String[] longOpts = {"exe=", "core=", "pid=", + String[] longOpts = {"exe=", "core=", "pid=", "connect=", "flags", "sysprops"}; ArrayList newArgs = new ArrayList(); String exe = null; String pid = null; String core = null; + String remote = NO_REMOTE; String s = null; while((s = sg.next(null, longOpts)) != null) { @@ -353,6 +394,10 @@ pid = sg.getOptarg(); continue; } + if (s.equals("connect")) { + remote = sg.getOptarg(); + continue; + } if (s.equals("flags")) { newArgs.add("-flags"); continue; @@ -363,18 +408,19 @@ } } - buildAttachArgs(newArgs, pid, exe, core, false); + buildAttachArgs(newArgs, pid, exe, core, remote, false); JInfo.main(newArgs.toArray(new String[newArgs.size()])); } private static void runJSNAP(String[] oldArgs) { SAGetopt sg = new SAGetopt(oldArgs); - String[] longOpts = {"exe=", "core=", "pid=", "all"}; + String[] longOpts = {"exe=", "core=", "pid=", "connect=", "all"}; ArrayList newArgs = new ArrayList(); String exe = null; String pid = null; String core = null; + String remote = NO_REMOTE; String s = null; while((s = sg.next(null, longOpts)) != null) { @@ -390,13 +436,17 @@ pid = sg.getOptarg(); continue; } + if (s.equals("connect")) { + remote = sg.getOptarg(); + continue; + } if (s.equals("all")) { newArgs.add("-a"); continue; } } - buildAttachArgs(newArgs, pid, exe, core, false); + buildAttachArgs(newArgs, pid, exe, core, remote, false); JSnap.main(newArgs.toArray(new String[newArgs.size()])); } @@ -436,7 +486,7 @@ } } - buildAttachArgs(newArgs, pid, exe, core, false); + buildAttachArgs(newArgs, pid, exe, core, NO_REMOTE, false); if (serverid != null) { newArgs.add(serverid); }