< prev index next >
src/share/vm/services/diagnosticCommand.cpp
Print this page
@@ -69,10 +69,11 @@
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<SymboltableDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<StringtableDCmd>(full_export, true, false));
#endif // INCLUDE_SERVICES
#if INCLUDE_JVMTI
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JVMTIDataDumpDCmd>(full_export, true, false));
+ DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JVMTIAgentLoadDCmd>(full_export, true, false));
#endif // INCLUDE_JVMTI
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ThreadDumpDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassLoaderStatsDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<CompileQueueDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<CodeListDCmd>(full_export, true, false));
@@ -252,10 +253,63 @@
if (JvmtiExport::should_post_data_dump()) {
JvmtiExport::post_data_dump();
}
}
+JVMTIAgentLoadDCmd::JVMTIAgentLoadDCmd(outputStream* output, bool heap) :
+ DCmdWithParser(output, heap),
+ _libpath("library path", "Absolute path of the JVMTI agent to load.",
+ "STRING", true),
+ _option("agent option", "Option string to pass the agent.", "STRING", false) {
+ _dcmdparser.add_dcmd_argument(&_libpath);
+ _dcmdparser.add_dcmd_argument(&_option);
+}
+
+void JVMTIAgentLoadDCmd::execute(DCmdSource source, TRAPS) {
+
+ if (_libpath.value() == NULL) {
+ output()->print_cr("JVMTI.agent_load dcmd needs library path.");
+ return;
+ }
+
+ char *suffix = strrchr(_libpath.value(), '.');
+ bool is_java_agent = (suffix != NULL) && (strncmp(".jar", suffix, 4) == 0);
+
+ if (is_java_agent) {
+ if (_option.value() == NULL) {
+ JvmtiExport::load_agent_library("instrument", "false",
+ _libpath.value(), output());
+ } else {
+ int opt_len = strlen(_libpath.value()) + strlen(_option.value()) + 2;
+ char *opt = (char *)os::malloc(opt_len, mtInternal);
+ if (opt == NULL) {
+ vm_exit_out_of_memory(opt_len, OOM_MALLOC_ERROR,
+ "JVMTIAgentLoadDCmd::execute");
+ }
+
+ snprintf(opt, opt_len, "%s=%s", _libpath.value(), _option.value());
+ JvmtiExport::load_agent_library("instrument", "false", opt, output());
+
+ os::free(opt);
+ }
+ } else {
+ JvmtiExport::load_agent_library(_libpath.value(), "true",
+ _option.value(), output());
+ }
+}
+
+int JVMTIAgentLoadDCmd::num_arguments() {
+ ResourceMark rm;
+ JVMTIAgentLoadDCmd* dcmd = new JVMTIAgentLoadDCmd(NULL, false);
+ if (dcmd != NULL) {
+ DCmdMark mark(dcmd);
+ return dcmd->_dcmdparser.num_arguments();
+ } else {
+ return 0;
+ }
+}
+
void PrintSystemPropertiesDCmd::execute(DCmdSource source, TRAPS) {
// load sun.misc.VMSupport
Symbol* klass = vmSymbols::sun_misc_VMSupport();
Klass* k = SystemDictionary::resolve_or_fail(klass, true, CHECK);
instanceKlassHandle ik (THREAD, k);
< prev index next >