< prev index next >

src/hotspot/share/services/diagnosticCommand.cpp

Print this page

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