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);
|