< prev index next >

src/hotspot/share/services/diagnosticCommand.cpp

Print this page

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);
< prev index next >