< prev index next >

src/hotspot/share/services/diagnosticCommand.cpp

Print this page

1055   JavaValue result(T_OBJECT);
1056   JavaCallArguments args;
1057   args.push_int(is_static);
1058   args.push_oop(fileh);
1059   JavaCalls::call_static(&result,
1060                          cds_klass,
1061                          vmSymbols::dumpSharedArchive(),
1062                          vmSymbols::dumpSharedArchive_signature(),
1063                          &args, CHECK);
1064   if (!HAS_PENDING_EXCEPTION) {
1065     assert(result.get_type() == T_OBJECT, "Sanity check");
1066     // result contains the archive name
1067     char* archive_name = java_lang_String::as_utf8_string(result.get_oop());
1068     output()->print_cr("%s", archive_name);
1069   }
1070 }
1071 #endif // INCLUDE_CDS
1072 
1073 ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) :
1074                                            DCmdWithParser(output, heap),
1075   _overwrite("-overwrite", "May overwrite existing file", "BOOLEAN", false, "false"),
1076   _format("-format", "Output format (\"plain\" or \"json\")", "STRING", false, "plain"),
1077   _filepath("filepath", "The file path to the output file", "FILE", true) {
1078   _dcmdparser.add_dcmd_option(&_overwrite);

1079   _dcmdparser.add_dcmd_option(&_format);

1080   _dcmdparser.add_dcmd_argument(&_filepath);

1081 }
1082 
1083 void ThreadDumpToFileDCmd::execute(DCmdSource source, TRAPS) {
1084   bool json = (_format.value() != nullptr) && (strcmp(_format.value(), "json") == 0);
1085   char* path = _filepath.value();
1086   bool overwrite = _overwrite.value();

1087   Symbol* name = (json) ? vmSymbols::dumpThreadsToJson_name() : vmSymbols::dumpThreads_name();
1088   dumpToFile(name, vmSymbols::string_bool_byte_array_signature(), path, overwrite, CHECK);
1089 }
1090 
1091 void ThreadDumpToFileDCmd::dumpToFile(Symbol* name, Symbol* signature, const char* path, bool overwrite, TRAPS) {
1092   ResourceMark rm(THREAD);
1093   HandleMark hm(THREAD);
1094 
1095   Handle h_path = java_lang_String::create_from_str(path, CHECK);
1096 
1097   Symbol* sym = vmSymbols::jdk_internal_vm_ThreadDumper();
1098   Klass* k = SystemDictionary::resolve_or_fail(sym, true, CHECK);
1099 
1100   // invoke the ThreadDump method to dump to file
1101   JavaValue result(T_OBJECT);
1102   JavaCallArguments args;
1103   args.push_oop(h_path);
1104   args.push_int(overwrite ? JNI_TRUE : JNI_FALSE);

1105   JavaCalls::call_static(&result,
1106                          k,
1107                          name,
1108                          signature,
1109                          &args,
1110                          THREAD);
1111   if (HAS_PENDING_EXCEPTION) {
1112     java_lang_Throwable::print(PENDING_EXCEPTION, output());
1113     output()->cr();
1114     CLEAR_PENDING_EXCEPTION;
1115     return;
1116   }
1117 
1118   // check that result is byte array
1119   oop res = cast_to_oop(result.get_jobject());
1120   assert(res->is_typeArray(), "just checking");
1121   assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
1122 
1123   // copy the bytes to the output stream
1124   typeArrayOop ba = typeArrayOop(res);

1055   JavaValue result(T_OBJECT);
1056   JavaCallArguments args;
1057   args.push_int(is_static);
1058   args.push_oop(fileh);
1059   JavaCalls::call_static(&result,
1060                          cds_klass,
1061                          vmSymbols::dumpSharedArchive(),
1062                          vmSymbols::dumpSharedArchive_signature(),
1063                          &args, CHECK);
1064   if (!HAS_PENDING_EXCEPTION) {
1065     assert(result.get_type() == T_OBJECT, "Sanity check");
1066     // result contains the archive name
1067     char* archive_name = java_lang_String::as_utf8_string(result.get_oop());
1068     output()->print_cr("%s", archive_name);
1069   }
1070 }
1071 #endif // INCLUDE_CDS
1072 
1073 ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) :
1074                                            DCmdWithParser(output, heap),

1075   _format("-format", "Output format (\"plain\" or \"json\")", "STRING", false, "plain"),
1076   _minify("-minify", "Remove whitespace and line breaks when format is \"json\"", "BOOLEAN", false, "false"),
1077   _filepath("filepath", "The file path to the output file", "FILE", true),
1078   _overwrite("-overwrite", "May overwrite existing file", "BOOLEAN", false, "false") {
1079   _dcmdparser.add_dcmd_option(&_format);
1080   _dcmdparser.add_dcmd_option(&_minify);
1081   _dcmdparser.add_dcmd_argument(&_filepath);
1082   _dcmdparser.add_dcmd_option(&_overwrite);
1083 }
1084 
1085 void ThreadDumpToFileDCmd::execute(DCmdSource source, TRAPS) {
1086   bool json = (_format.value() != nullptr) && (strcmp(_format.value(), "json") == 0);
1087   char* path = _filepath.value();
1088   bool overwrite = _overwrite.value();
1089   bool minify = (json) ? _minify.value() : false;
1090   Symbol* name = (json) ? vmSymbols::dumpThreadsToJson_name() : vmSymbols::dumpThreads_name();
1091   dumpToFile(name, vmSymbols::string_bool_bool_byte_array_signature(), path, overwrite, minify, CHECK);
1092 }
1093 
1094 void ThreadDumpToFileDCmd::dumpToFile(Symbol* name, Symbol* signature, const char* path, bool overwrite, bool minify, TRAPS) {
1095   ResourceMark rm(THREAD);
1096   HandleMark hm(THREAD);
1097 
1098   Handle h_path = java_lang_String::create_from_str(path, CHECK);
1099 
1100   Symbol* sym = vmSymbols::jdk_internal_vm_ThreadDumper();
1101   Klass* k = SystemDictionary::resolve_or_fail(sym, true, CHECK);
1102 
1103   // invoke the ThreadDump method to dump to file
1104   JavaValue result(T_OBJECT);
1105   JavaCallArguments args;
1106   args.push_oop(h_path);
1107   args.push_int(overwrite ? JNI_TRUE : JNI_FALSE);
1108   args.push_int(minify ? JNI_TRUE : JNI_FALSE);
1109   JavaCalls::call_static(&result,
1110                          k,
1111                          name,
1112                          signature,
1113                          &args,
1114                          THREAD);
1115   if (HAS_PENDING_EXCEPTION) {
1116     java_lang_Throwable::print(PENDING_EXCEPTION, output());
1117     output()->cr();
1118     CLEAR_PENDING_EXCEPTION;
1119     return;
1120   }
1121 
1122   // check that result is byte array
1123   oop res = cast_to_oop(result.get_jobject());
1124   assert(res->is_typeArray(), "just checking");
1125   assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
1126 
1127   // copy the bytes to the output stream
1128   typeArrayOop ba = typeArrayOop(res);
< prev index next >