hotspot/src/share/vm/services/diagnosticCommand.cpp
changeset 36188 99b6836dd3e8
parent 35825 7c7652ee137b
child 36334 0ae9bbe75458
equal deleted inserted replaced
36187:1d61b06a3ae1 36188:99b6836dd3e8
    69   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<SymboltableDCmd>(full_export, true, false));
    69   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<SymboltableDCmd>(full_export, true, false));
    70   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<StringtableDCmd>(full_export, true, false));
    70   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<StringtableDCmd>(full_export, true, false));
    71 #endif // INCLUDE_SERVICES
    71 #endif // INCLUDE_SERVICES
    72 #if INCLUDE_JVMTI
    72 #if INCLUDE_JVMTI
    73   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JVMTIDataDumpDCmd>(full_export, true, false));
    73   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JVMTIDataDumpDCmd>(full_export, true, false));
       
    74   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JVMTIAgentLoadDCmd>(full_export, true, false));
    74 #endif // INCLUDE_JVMTI
    75 #endif // INCLUDE_JVMTI
    75   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ThreadDumpDCmd>(full_export, true, false));
    76   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ThreadDumpDCmd>(full_export, true, false));
    76   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassLoaderStatsDCmd>(full_export, true, false));
    77   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassLoaderStatsDCmd>(full_export, true, false));
    77   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<CompileQueueDCmd>(full_export, true, false));
    78   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<CompileQueueDCmd>(full_export, true, false));
    78   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<CodeListDCmd>(full_export, true, false));
    79   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<CodeListDCmd>(full_export, true, false));
   252   if (JvmtiExport::should_post_data_dump()) {
   253   if (JvmtiExport::should_post_data_dump()) {
   253     JvmtiExport::post_data_dump();
   254     JvmtiExport::post_data_dump();
   254   }
   255   }
   255 }
   256 }
   256 
   257 
       
   258 JVMTIAgentLoadDCmd::JVMTIAgentLoadDCmd(outputStream* output, bool heap) :
       
   259                                        DCmdWithParser(output, heap),
       
   260   _libpath("library path", "Absolute path of the JVMTI agent to load.",
       
   261            "STRING", true),
       
   262   _option("agent option", "Option string to pass the agent.", "STRING", false) {
       
   263   _dcmdparser.add_dcmd_argument(&_libpath);
       
   264   _dcmdparser.add_dcmd_argument(&_option);
       
   265 }
       
   266 
       
   267 void JVMTIAgentLoadDCmd::execute(DCmdSource source, TRAPS) {
       
   268 
       
   269   if (_libpath.value() == NULL) {
       
   270     output()->print_cr("JVMTI.agent_load dcmd needs library path.");
       
   271     return;
       
   272   }
       
   273 
       
   274   char *suffix = strrchr(_libpath.value(), '.');
       
   275   bool is_java_agent = (suffix != NULL) && (strncmp(".jar", suffix, 4) == 0);
       
   276 
       
   277   if (is_java_agent) {
       
   278     if (_option.value() == NULL) {
       
   279       JvmtiExport::load_agent_library("instrument", "false",
       
   280                                       _libpath.value(), output());
       
   281     } else {
       
   282       size_t opt_len = strlen(_libpath.value()) + strlen(_option.value()) + 2;
       
   283       if (opt_len > 4096) {
       
   284         output()->print_cr("JVMTI agent attach failed: Options is too long.");
       
   285         return;
       
   286       }
       
   287 
       
   288       char *opt = (char *)os::malloc(opt_len, mtInternal);
       
   289       if (opt == NULL) {
       
   290         output()->print_cr("JVMTI agent attach failed: "
       
   291                            "Could not allocate %zu bytes for argument.",
       
   292                            opt_len);
       
   293         return;
       
   294       }
       
   295 
       
   296       jio_snprintf(opt, opt_len, "%s=%s", _libpath.value(), _option.value());
       
   297       JvmtiExport::load_agent_library("instrument", "false", opt, output());
       
   298 
       
   299       os::free(opt);
       
   300     }
       
   301   } else {
       
   302     JvmtiExport::load_agent_library(_libpath.value(), "true",
       
   303                                     _option.value(), output());
       
   304   }
       
   305 }
       
   306 
       
   307 int JVMTIAgentLoadDCmd::num_arguments() {
       
   308   ResourceMark rm;
       
   309   JVMTIAgentLoadDCmd* dcmd = new JVMTIAgentLoadDCmd(NULL, false);
       
   310   if (dcmd != NULL) {
       
   311     DCmdMark mark(dcmd);
       
   312     return dcmd->_dcmdparser.num_arguments();
       
   313   } else {
       
   314     return 0;
       
   315   }
       
   316 }
       
   317 
   257 void PrintSystemPropertiesDCmd::execute(DCmdSource source, TRAPS) {
   318 void PrintSystemPropertiesDCmd::execute(DCmdSource source, TRAPS) {
   258   // load sun.misc.VMSupport
   319   // load sun.misc.VMSupport
   259   Symbol* klass = vmSymbols::sun_misc_VMSupport();
   320   Symbol* klass = vmSymbols::sun_misc_VMSupport();
   260   Klass* k = SystemDictionary::resolve_or_fail(klass, true, CHECK);
   321   Klass* k = SystemDictionary::resolve_or_fail(klass, true, CHECK);
   261   instanceKlassHandle ik (THREAD, k);
   322   instanceKlassHandle ik (THREAD, k);