< prev index next >

src/hotspot/share/services/diagnosticCommand.cpp

Print this page

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