From cb9cab9d5bbd26efc03b5a0e45268efd6c9e180d Mon Sep 17 00:00:00 2001 From: Ivan Bereziuk Date: Thu, 18 Sep 2025 16:17:32 +0200 Subject: [PATCH] 8357828: add timestamps to jcmd diagnostic commands --- src/hotspot/share/runtime/threads.cpp | 4 +-- .../share/services/diagnosticCommand.cpp | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index 65eea9d5fb2..98f6889cfd8 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -1344,13 +1344,11 @@ public: void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks, bool print_extended_info) { - char buf[32]; - st->print_raw_cr(os::local_time_string(buf, sizeof(buf))); - st->print_cr("Full thread dump %s (%s %s)", VM_Version::vm_name(), VM_Version::vm_release(), VM_Version::vm_info_string()); + char buf[32]; JDK_Version::current().to_string(buf, sizeof(buf)); const char* runtime_name = JDK_Version::runtime_name() != nullptr ? JDK_Version::runtime_name() : ""; diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp index 5bef650891d..98311804476 100644 --- a/src/hotspot/share/services/diagnosticCommand.cpp +++ b/src/hotspot/share/services/diagnosticCommand.cpp @@ -183,6 +183,12 @@ static int compare_strings(const char** s1, const char** s2) { return ::strcmp(*s1, *s2); } +static void print_local_time(outputStream* output) { + char buf[32]; + output->print_cr("%s", os::local_time_string(buf, sizeof(buf))); +} + + void HelpDCmd::execute(DCmdSource source, TRAPS) { if (_all.value()) { GrowableArray* cmd_list = DCmdFactory::DCmd_list(source); @@ -250,6 +256,7 @@ PrintVMFlagsDCmd::PrintVMFlagsDCmd(outputStream* output, bool heap) : } void PrintVMFlagsDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); if (_all.value()) { JVMFlag::printFlags(output(), true); } else { @@ -398,6 +405,7 @@ void VMUptimeDCmd::execute(DCmdSource source, TRAPS) { } void VMInfoDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); VMError::print_vm_info(_output); } @@ -414,11 +422,13 @@ void RunFinalizationDCmd::execute(DCmdSource source, TRAPS) { } void HeapInfoDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); MutexLocker hl(THREAD, Heap_lock); Universe::heap()->print_heap_on(output()); } void FinalizerInfoDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); ResourceMark rm(THREAD); if (!InstanceKlass::is_finalization_enabled()) { @@ -492,6 +502,7 @@ HeapDumpDCmd::HeapDumpDCmd(outputStream* output, bool heap) : } void HeapDumpDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); jlong level = -1; // -1 means no compression. jlong parallel = HeapDumper::default_num_of_dump_threads(); @@ -539,6 +550,7 @@ ClassHistogramDCmd::ClassHistogramDCmd(outputStream* output, bool heap) : } void ClassHistogramDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); jlong num = _parallel_thread_num.value(); if (num < 0) { output()->print_cr("Parallel thread number out of range (>=0): " JLONG_FORMAT, num); @@ -564,6 +576,7 @@ ThreadDumpDCmd::ThreadDumpDCmd(outputStream* output, bool heap) : } void ThreadDumpDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); // thread stacks and JNI global handles VM_PrintThreads op1(output(), _locks.value(), _extended.value(), true /* print JNI handle info */); VMThread::execute(&op1); @@ -801,6 +814,7 @@ JMXStatusDCmd::JMXStatusDCmd(outputStream *output, bool heap_allocated) : } void JMXStatusDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); ResourceMark rm(THREAD); HandleMark hm(THREAD); @@ -834,20 +848,24 @@ VMDynamicLibrariesDCmd::VMDynamicLibrariesDCmd(outputStream *output, bool heap_a } void VMDynamicLibrariesDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); os::print_dll_info(output()); output()->cr(); } void CompileQueueDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); VM_PrintCompileQueue printCompileQueueOp(output()); VMThread::execute(&printCompileQueueOp); } void CodeListDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); CodeCache::print_codelist(output()); } void CodeCacheDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); CodeCache::print_layout(output()); } @@ -860,6 +878,7 @@ PerfMapDCmd::PerfMapDCmd(outputStream* output, bool heap) : } void PerfMapDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); CodeCache::write_perf_map(_filename.value(), output()); } #endif // LINUX @@ -874,6 +893,8 @@ CodeHeapAnalyticsDCmd::CodeHeapAnalyticsDCmd(outputStream* output, bool heap) : } void CodeHeapAnalyticsDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); + jlong granularity = _granularity.value(); if (granularity < 1) { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IllegalArgumentException(), @@ -895,6 +916,7 @@ EventLogDCmd::EventLogDCmd(outputStream* output, bool heap) : } void EventLogDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); int max = (int)_max.value(); if (max < 0) { output()->print_cr("Invalid max option: \"%d\".", max); @@ -909,6 +931,7 @@ void EventLogDCmd::execute(DCmdSource source, TRAPS) { } void CompilerDirectivesPrintDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); DirectivesStack::print(output()); } @@ -929,6 +952,7 @@ void CompilerDirectivesRemoveDCmd::execute(DCmdSource source, TRAPS) { void CompilerDirectivesClearDCmd::execute(DCmdSource source, TRAPS) { DirectivesStack::clear(); } + #if INCLUDE_SERVICES ClassHierarchyDCmd::ClassHierarchyDCmd(outputStream* output, bool heap) : DCmdWithParser(output, heap), @@ -945,6 +969,7 @@ ClassHierarchyDCmd::ClassHierarchyDCmd(outputStream* output, bool heap) : } void ClassHierarchyDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); VM_PrintClassHierarchy printClassHierarchyOp(output(), _print_interfaces.value(), _print_subclasses.value(), _classname.value()); VMThread::execute(&printClassHierarchyOp); @@ -982,6 +1007,7 @@ public: }; void ClassesDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); VM_PrintClasses vmop(output(), _verbose.value()); VMThread::execute(&vmop); } @@ -1000,6 +1026,7 @@ DumpSharedArchiveDCmd::DumpSharedArchiveDCmd(outputStream* output, bool heap) : } void DumpSharedArchiveDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); jboolean is_static; const char* scmd = _suboption.value(); @@ -1063,6 +1090,7 @@ ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) : } void ThreadDumpToFileDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); bool json = (_format.value() != nullptr) && (strcmp(_format.value(), "json") == 0); char* path = _filepath.value(); bool overwrite = _overwrite.value(); @@ -1140,10 +1168,12 @@ static void execute_vthread_command(Symbol* method_name, outputStream* output, T } void VThreadSchedulerDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); execute_vthread_command(vmSymbols::printScheduler_name(), output(), CHECK); } void VThreadPollersDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); execute_vthread_command(vmSymbols::printPollers_name(), output(), CHECK); } @@ -1158,6 +1188,7 @@ CompilationMemoryStatisticDCmd::CompilationMemoryStatisticDCmd(outputStream* out } void CompilationMemoryStatisticDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); const size_t minsize = _minsize.has_value() ? _minsize.value()._size : 0; CompilationMemoryStatistic::print_jcmd_report(output(), _verbose.value(), _legend.value(), minsize); } @@ -1167,6 +1198,7 @@ void CompilationMemoryStatisticDCmd::execute(DCmdSource source, TRAPS) { SystemMapDCmd::SystemMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} void SystemMapDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); MemMapPrinter::print_all_mappings(output()); } @@ -1179,6 +1211,7 @@ SystemDumpMapDCmd::SystemDumpMapDCmd(outputStream* output, bool heap) : } void SystemDumpMapDCmd::execute(DCmdSource source, TRAPS) { + print_local_time(output()); const char* name = _filename.value(); if (name == nullptr || name[0] == 0) { output()->print_cr("filename is empty or not specified. No file written");