RFR: 8334492: DiagnosticCommands (jcmd) should accept %p in output filenames and substitute PID [v17]
Kevin Walls
kevinw at openjdk.org
Tue Jul 30 10:14:37 UTC 2024
On Mon, 29 Jul 2024 19:08:17 GMT, Sonia Zaldana Calles <szaldana at openjdk.org> wrote:
>> Hi all,
>>
>> This PR addresses [8334492](https://bugs.openjdk.org/browse/JDK-8334492) enabling jcmd diagnostic commands that issue an output file to accept the `%p` pattern in the file name and substitute it for the PID.
>>
>> This PR addresses the following diagnostic commands:
>> - [x] Compiler.perfmap
>> - [x] GC.heap_dump
>> - [x] System.dump_map
>> - [x] Thread.dump_to_file
>> - [x] VM.cds
>>
>> Note that some jcmd diagnostic commands already enable this functionality (`JFR.configure, JFR.dump, JFR.start and JFR.stop`).
>>
>> I propose opening a separate issue to track updating the man page similarly to how it’s done for the JFR diagnostic commands. For example,
>>
>>
>> filename (Optional) Name of the file to which the flight recording data is
>> written when the recording is stopped. If no filename is given, a
>> filename is generated from the PID and the current date and is
>> placed in the directory where the process was started. The
>> filename may also be a directory in which case, the filename is
>> generated from the PID and the current date in the specified
>> directory. (STRING, no default value)
>>
>> Note: If a filename is given, '%p' in the filename will be
>> replaced by the PID, and '%t' will be replaced by the time in
>> 'yyyy_MM_dd_HH_mm_ss' format.
>>
>>
>> Unfortunately, per [8276265](https://bugs.openjdk.org/browse/JDK-8276265), sources for the jcmd manpage remain in Oracle internal repos so this PR can’t address that.
>>
>> Testing:
>>
>> - [x] Added test case passes.
>> - [x] Modified existing VM.cds tests to also check for `%p` filenames.
>>
>> Looking forward to your comments and addressing any diagnostic commands I might have missed (if any).
>>
>> Cheers,
>> Sonia
>
> Sonia Zaldana Calles has updated the pull request incrementally with one additional commit since the last revision:
>
> last lingering change
Thanks Sonia, and thanks Thomas!
I did just see a poblem with DumpPerfMapAtExit that I didn't notice before. When -XX:+DumpPerfMapAtExit causes a call to CodeCache::write_perf_map, there's now no %p substitution so /tmp/perf-%p.map gets created.
We all hate duplication but CodeCache::write_perf_map has two very different callers. It could do something like this (feel free to adjust/correct/do something else):
src/hotspot/share/code/codeCache.cpp
#ifdef LINUX
void CodeCache::write_perf_map(const char* filename, outputStream* st) {
MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ if (filename == nullptr) {
+ st->print_cr("Warning: Not writing perf map as null filename provided.");
+ return;
+ }
+ char fname[JVM_MAXPATHLEN];
+ if (strstr(filename, "%p") != nullptr) {
+ // Unnecessary if filename contains %%p but will be a rare waste of time:
+ if (!Arguments::copy_expand_pid(filename, strlen(filename), fname, JVM_MAXPATHLEN)) {
+ st->print_cr("Warning: Not writing perf map as substitution failed.");
+ return;
+ }
+ filename = fname;
+ }
+
fileStream fs(filename, "w");
JVM_MAXPATHLEN will have a lot of slack space there as if it contains %p it really should be the default filename, so you could go with a lower value.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/20198#issuecomment-2257986965
More information about the serviceability-dev
mailing list