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