1053 JavaValue result(T_OBJECT);
1054 JavaCallArguments args;
1055 args.push_int(is_static);
1056 args.push_oop(fileh);
1057 JavaCalls::call_static(&result,
1058 cds_klass,
1059 vmSymbols::dumpSharedArchive(),
1060 vmSymbols::dumpSharedArchive_signature(),
1061 &args, CHECK);
1062 if (!HAS_PENDING_EXCEPTION) {
1063 assert(result.get_type() == T_OBJECT, "Sanity check");
1064 // result contains the archive name
1065 char* archive_name = java_lang_String::as_utf8_string(result.get_oop());
1066 output()->print_cr("%s", archive_name);
1067 }
1068 }
1069 #endif // INCLUDE_CDS
1070
1071 ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) :
1072 DCmdWithParser(output, heap),
1073 _overwrite("-overwrite", "May overwrite existing file", "BOOLEAN", false, "false"),
1074 _format("-format", "Output format (\"plain\" or \"json\")", "STRING", false, "plain"),
1075 _filepath("filepath", "The file path to the output file", "FILE", true) {
1076 _dcmdparser.add_dcmd_option(&_overwrite);
1077 _dcmdparser.add_dcmd_option(&_format);
1078 _dcmdparser.add_dcmd_argument(&_filepath);
1079 }
1080
1081 void ThreadDumpToFileDCmd::execute(DCmdSource source, TRAPS) {
1082 bool json = (_format.value() != nullptr) && (strcmp(_format.value(), "json") == 0);
1083 char* path = _filepath.value();
1084 bool overwrite = _overwrite.value();
1085 Symbol* name = (json) ? vmSymbols::dumpThreadsToJson_name() : vmSymbols::dumpThreads_name();
1086 dumpToFile(name, vmSymbols::string_bool_byte_array_signature(), path, overwrite, CHECK);
1087 }
1088
1089 void ThreadDumpToFileDCmd::dumpToFile(Symbol* name, Symbol* signature, const char* path, bool overwrite, TRAPS) {
1090 ResourceMark rm(THREAD);
1091 HandleMark hm(THREAD);
1092
1093 Handle h_path = java_lang_String::create_from_str(path, CHECK);
1094
1095 Symbol* sym = vmSymbols::jdk_internal_vm_ThreadDumper();
1096 Klass* k = SystemDictionary::resolve_or_fail(sym, true, CHECK);
1097
1098 // invoke the ThreadDump method to dump to file
1099 JavaValue result(T_OBJECT);
1100 JavaCallArguments args;
1101 args.push_oop(h_path);
1102 args.push_int(overwrite ? JNI_TRUE : JNI_FALSE);
1103 JavaCalls::call_static(&result,
1104 k,
1105 name,
1106 signature,
1107 &args,
1108 THREAD);
1109 if (HAS_PENDING_EXCEPTION) {
1110 java_lang_Throwable::print(PENDING_EXCEPTION, output());
1111 output()->cr();
1112 CLEAR_PENDING_EXCEPTION;
1113 return;
1114 }
1115
1116 // check that result is byte array
1117 oop res = cast_to_oop(result.get_jobject());
1118 assert(res->is_typeArray(), "just checking");
1119 assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
1120
1121 // copy the bytes to the output stream
1122 typeArrayOop ba = typeArrayOop(res);
|
1053 JavaValue result(T_OBJECT);
1054 JavaCallArguments args;
1055 args.push_int(is_static);
1056 args.push_oop(fileh);
1057 JavaCalls::call_static(&result,
1058 cds_klass,
1059 vmSymbols::dumpSharedArchive(),
1060 vmSymbols::dumpSharedArchive_signature(),
1061 &args, CHECK);
1062 if (!HAS_PENDING_EXCEPTION) {
1063 assert(result.get_type() == T_OBJECT, "Sanity check");
1064 // result contains the archive name
1065 char* archive_name = java_lang_String::as_utf8_string(result.get_oop());
1066 output()->print_cr("%s", archive_name);
1067 }
1068 }
1069 #endif // INCLUDE_CDS
1070
1071 ThreadDumpToFileDCmd::ThreadDumpToFileDCmd(outputStream* output, bool heap) :
1072 DCmdWithParser(output, heap),
1073 _format("-format", "Output format (\"plain\" or \"json\")", "STRING", false, "plain"),
1074 _no_prettyprint("-no-prettyprint", "Remove whitespace and line breaks when format is \"json\"", "BOOLEAN", false, "false"),
1075 _filepath("filepath", "The file path to the output file", "FILE", true),
1076 _overwrite("-overwrite", "May overwrite existing file", "BOOLEAN", false, "false") {
1077 _dcmdparser.add_dcmd_option(&_format);
1078 _dcmdparser.add_dcmd_option(&_no_prettyprint);
1079 _dcmdparser.add_dcmd_argument(&_filepath);
1080 _dcmdparser.add_dcmd_option(&_overwrite);
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 bool prettyprint = (json) ? !_no_prettyprint.value() : true;
1088 Symbol* name = (json) ? vmSymbols::dumpThreadsToJson_name() : vmSymbols::dumpThreads_name();
1089 dumpToFile(name, vmSymbols::string_bool_bool_byte_array_signature(), path, overwrite, prettyprint, CHECK);
1090 }
1091
1092 void ThreadDumpToFileDCmd::dumpToFile(Symbol* name, Symbol* signature, const char* path, bool overwrite, bool prettyprint, TRAPS) {
1093 ResourceMark rm(THREAD);
1094 HandleMark hm(THREAD);
1095
1096 Handle h_path = java_lang_String::create_from_str(path, CHECK);
1097
1098 Symbol* sym = vmSymbols::jdk_internal_vm_ThreadDumper();
1099 Klass* k = SystemDictionary::resolve_or_fail(sym, true, CHECK);
1100
1101 // invoke the ThreadDump method to dump to file
1102 JavaValue result(T_OBJECT);
1103 JavaCallArguments args;
1104 args.push_oop(h_path);
1105 args.push_int(overwrite ? JNI_TRUE : JNI_FALSE);
1106 args.push_int(prettyprint ? JNI_TRUE : JNI_FALSE);
1107 JavaCalls::call_static(&result,
1108 k,
1109 name,
1110 signature,
1111 &args,
1112 THREAD);
1113 if (HAS_PENDING_EXCEPTION) {
1114 java_lang_Throwable::print(PENDING_EXCEPTION, output());
1115 output()->cr();
1116 CLEAR_PENDING_EXCEPTION;
1117 return;
1118 }
1119
1120 // check that result is byte array
1121 oop res = cast_to_oop(result.get_jobject());
1122 assert(res->is_typeArray(), "just checking");
1123 assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
1124
1125 // copy the bytes to the output stream
1126 typeArrayOop ba = typeArrayOop(res);
|