1080 JavaValue result(T_OBJECT);
1081 JavaCallArguments args;
1082 args.push_int(is_static);
1083 args.push_oop(fileh);
1084 JavaCalls::call_static(&result,
1085 cds_klass,
1086 vmSymbols::dumpSharedArchive(),
1087 vmSymbols::dumpSharedArchive_signature(),
1088 &args, CHECK);
1089 if (!HAS_PENDING_EXCEPTION) {
1090 assert(result.get_type() == T_OBJECT, "Sanity check");
1091 // result contains the archive name
1092 char* archive_name = java_lang_String::as_utf8_string(result.get_oop());
1093 output()->print_cr("%s", archive_name);
1094 }
1095 }
1096 #endif // INCLUDE_CDS
1097
1098 ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) :
1099 DCmdWithParser(output, heap),
1100 _overwrite("-overwrite", "May overwrite existing file", "BOOLEAN", false, "false"),
1101 _format("-format", "Output format (\"plain\" or \"json\")", "STRING", false, "plain"),
1102 _filepath("filepath", "The file path to the output file", "FILE", true) {
1103 _dcmdparser.add_dcmd_option(&_overwrite);
1104 _dcmdparser.add_dcmd_option(&_format);
1105 _dcmdparser.add_dcmd_argument(&_filepath);
1106 }
1107
1108 void ThreadDumpToFileDCmd::execute(DCmdSource source, TRAPS) {
1109 bool json = (_format.value() != nullptr) && (strcmp(_format.value(), "json") == 0);
1110 char* path = _filepath.value();
1111 bool overwrite = _overwrite.value();
1112 Symbol* name = (json) ? vmSymbols::dumpThreadsToJson_name() : vmSymbols::dumpThreads_name();
1113 dumpToFile(name, vmSymbols::string_bool_byte_array_signature(), path, overwrite, CHECK);
1114 }
1115
1116 void ThreadDumpToFileDCmd::dumpToFile(Symbol* name, Symbol* signature, const char* path, bool overwrite, TRAPS) {
1117 ResourceMark rm(THREAD);
1118 HandleMark hm(THREAD);
1119
1120 Handle h_path = java_lang_String::create_from_str(path, CHECK);
1121
1122 Symbol* sym = vmSymbols::jdk_internal_vm_ThreadDumper();
1123 Klass* k = SystemDictionary::resolve_or_fail(sym, true, CHECK);
1124
1125 // invoke the ThreadDump method to dump to file
1126 JavaValue result(T_OBJECT);
1127 JavaCallArguments args;
1128 args.push_oop(h_path);
1129 args.push_int(overwrite ? JNI_TRUE : JNI_FALSE);
1130 JavaCalls::call_static(&result,
1131 k,
1132 name,
1133 signature,
1134 &args,
1135 THREAD);
1136 if (HAS_PENDING_EXCEPTION) {
1137 java_lang_Throwable::print(PENDING_EXCEPTION, output());
1138 output()->cr();
1139 CLEAR_PENDING_EXCEPTION;
1140 return;
1141 }
1142
1143 // check that result is byte array
1144 oop res = cast_to_oop(result.get_jobject());
1145 assert(res->is_typeArray(), "just checking");
1146 assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
1147
1148 // copy the bytes to the output stream
1149 typeArrayOop ba = typeArrayOop(res);
|
1080 JavaValue result(T_OBJECT);
1081 JavaCallArguments args;
1082 args.push_int(is_static);
1083 args.push_oop(fileh);
1084 JavaCalls::call_static(&result,
1085 cds_klass,
1086 vmSymbols::dumpSharedArchive(),
1087 vmSymbols::dumpSharedArchive_signature(),
1088 &args, CHECK);
1089 if (!HAS_PENDING_EXCEPTION) {
1090 assert(result.get_type() == T_OBJECT, "Sanity check");
1091 // result contains the archive name
1092 char* archive_name = java_lang_String::as_utf8_string(result.get_oop());
1093 output()->print_cr("%s", archive_name);
1094 }
1095 }
1096 #endif // INCLUDE_CDS
1097
1098 ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) :
1099 DCmdWithParser(output, heap),
1100 _format("-format", "Output format (\"plain\" or \"json\")", "STRING", false, "plain"),
1101 _no_prettyprint("-no-prettyprint", "Remove whitespace and line breaks when format is \"json\"", "BOOLEAN", false, "false"),
1102 _filepath("filepath", "The file path to the output file", "FILE", true),
1103 _overwrite("-overwrite", "May overwrite existing file", "BOOLEAN", false, "false") {
1104 _dcmdparser.add_dcmd_option(&_format);
1105 _dcmdparser.add_dcmd_option(&_no_prettyprint);
1106 _dcmdparser.add_dcmd_argument(&_filepath);
1107 _dcmdparser.add_dcmd_option(&_overwrite);
1108 }
1109
1110 void ThreadDumpToFileDCmd::execute(DCmdSource source, TRAPS) {
1111 bool json = (_format.value() != nullptr) && (strcmp(_format.value(), "json") == 0);
1112 char* path = _filepath.value();
1113 bool overwrite = _overwrite.value();
1114 bool prettyprint = (json) ? !_no_prettyprint.value() : true;
1115 Symbol* name = (json) ? vmSymbols::dumpThreadsToJson_name() : vmSymbols::dumpThreads_name();
1116 dumpToFile(name, vmSymbols::string_bool_bool_byte_array_signature(), path, overwrite, prettyprint, CHECK);
1117 }
1118
1119 void ThreadDumpToFileDCmd::dumpToFile(Symbol* name, Symbol* signature, const char* path, bool overwrite, bool prettyprint, TRAPS) {
1120 ResourceMark rm(THREAD);
1121 HandleMark hm(THREAD);
1122
1123 Handle h_path = java_lang_String::create_from_str(path, CHECK);
1124
1125 Symbol* sym = vmSymbols::jdk_internal_vm_ThreadDumper();
1126 Klass* k = SystemDictionary::resolve_or_fail(sym, true, CHECK);
1127
1128 // invoke the ThreadDump method to dump to file
1129 JavaValue result(T_OBJECT);
1130 JavaCallArguments args;
1131 args.push_oop(h_path);
1132 args.push_int(overwrite ? JNI_TRUE : JNI_FALSE);
1133 args.push_int(prettyprint ? JNI_TRUE : JNI_FALSE);
1134 JavaCalls::call_static(&result,
1135 k,
1136 name,
1137 signature,
1138 &args,
1139 THREAD);
1140 if (HAS_PENDING_EXCEPTION) {
1141 java_lang_Throwable::print(PENDING_EXCEPTION, output());
1142 output()->cr();
1143 CLEAR_PENDING_EXCEPTION;
1144 return;
1145 }
1146
1147 // check that result is byte array
1148 oop res = cast_to_oop(result.get_jobject());
1149 assert(res->is_typeArray(), "just checking");
1150 assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
1151
1152 // copy the bytes to the output stream
1153 typeArrayOop ba = typeArrayOop(res);
|