8357828: add timestamps to jcmd diagnostic commands

This commit is contained in:
Ivan Bereziuk 2025-09-18 16:17:32 +02:00
parent 73df06c80c
commit cb9cab9d5b
2 changed files with 34 additions and 3 deletions

View File

@ -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() : "";

View File

@ -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<const char*>* 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");