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); |