--- 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)) {
--- 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;
--- 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<String, String> settings) {
if (!hasJDKEvents(settings)) {
--- 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);