On Mon, 29 Jul 2024 19:08:17 GMT, Sonia Zaldana Calles <szald...@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

Reply via email to