# HG changeset patch # User egahlin # Date 1530191864 -7200 # Node ID fa91003ec489cf4a96065db9917a8c0b81587778 # Parent 1b346a59b5da1338b8d9c8703f50e22f99f953bd 8137164: Include PID in the JFR jcmd hint Reviewed-by: mgronlun, stuefe diff -r 1b346a59b5da -r fa91003ec489 src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/AbstractDCmd.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/AbstractDCmd.java Thu Jun 28 10:46:05 2018 -0400 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/AbstractDCmd.java Thu Jun 28 15:17:44 2018 +0200 @@ -39,6 +39,7 @@ import jdk.jfr.FlightRecorder; import jdk.jfr.Recording; +import jdk.jfr.internal.JVM; import jdk.jfr.internal.SecuritySupport; import jdk.jfr.internal.SecuritySupport.SafePath; import jdk.jfr.internal.Utils; @@ -65,9 +66,17 @@ return result.toString(); } + public String getPid() { + // Invoking ProcessHandle.current().pid() would require loading more + // classes during startup so instead JVM.getJVM().getPid() is used. + // The pid will not be exposed to running Java application, only when starting + // JFR from command line (-XX:StartFlightRecordin) or jcmd (JFR.start and JFR.check) + return JVM.getJVM().getPid(); + } + protected final SafePath resolvePath(Recording recording, String filename) throws InvalidPathException { if (filename == null) { - return makeGenerated(recording, Paths.get(".")); + return makeGenerated(recording, Paths.get(".")); } Path path = Paths.get(filename); if (Files.isDirectory(path)) { diff -r 1b346a59b5da -r fa91003ec489 src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdCheck.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdCheck.java Thu Jun 28 10:46:05 2018 -0400 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdCheck.java Thu Jun 28 15:17:44 2018 +0200 @@ -80,7 +80,7 @@ if (!verbose && recordings.isEmpty()) { println("No available recordings."); println(); - println("Use JFR.start to start a recording."); + println("Use jcmd " + getPid() + " JFR.start to start a recording."); return; } boolean first = true; diff -r 1b346a59b5da -r fa91003ec489 src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java Thu Jun 28 10:46:05 2018 -0400 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java Thu Jun 28 15:17:44 2018 +0200 @@ -220,12 +220,13 @@ if (name != null) { recordingspecifier = "name=" + quoteIfNeeded(name); } - print("Use JFR." + cmd + " " + recordingspecifier + " " + fileOption + "to copy recording data to file."); + print("Use jcmd " + getPid() + " JFR." + cmd + " " + recordingspecifier + " " + fileOption + "to copy recording data to file."); println(); } return getResult(); } + // Instruments JDK-events on class load to reduce startup time private void initializeWithForcedInstrumentation(Map settings) { if (!hasJDKEvents(settings)) { diff -r 1b346a59b5da -r fa91003ec489 test/jdk/jdk/jfr/jcmd/TestJcmdStartStopDefault.java --- a/test/jdk/jdk/jfr/jcmd/TestJcmdStartStopDefault.java Thu Jun 28 10:46:05 2018 -0400 +++ b/test/jdk/jdk/jfr/jcmd/TestJcmdStartStopDefault.java Thu Jun 28 15:17:44 2018 +0200 @@ -66,7 +66,7 @@ // Use JFR.dump name=recording-1 filename=FILEPATH to copy recording data to file. String stdout = output.getStdout(); - Pattern p = Pattern.compile(".*Use JFR.dump name=(\\S+).*", Pattern.DOTALL); + Pattern p = Pattern.compile(".*Use jcmd \\d+ JFR.dump name=(\\S+).*", Pattern.DOTALL); Matcher m = p.matcher(stdout); Asserts.assertTrue(m.matches(), "Could not parse recording name"); String name = m.group(1);