src/share/vm/prims/jvmtiManageCapabilities.cpp

Wed, 03 Jul 2019 20:42:37 +0800

author
aoqi
date
Wed, 03 Jul 2019 20:42:37 +0800
changeset 9637
eef07cd490d4
parent 6876
710a3c8b516e
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #include "precompiled.hpp"
aoqi@0 26 #include "jvmtifiles/jvmtiEnv.hpp"
aoqi@0 27 #include "prims/jvmtiExport.hpp"
aoqi@0 28 #include "prims/jvmtiManageCapabilities.hpp"
aoqi@0 29 static const jint CAPA_SIZE = (JVMTI_INTERNAL_CAPABILITY_COUNT + 7) / 8;
aoqi@0 30
aoqi@0 31 // capabilities which are always potentially available
aoqi@0 32 jvmtiCapabilities JvmtiManageCapabilities::always_capabilities;
aoqi@0 33
aoqi@0 34 // capabilities which are potentially available during OnLoad
aoqi@0 35 jvmtiCapabilities JvmtiManageCapabilities::onload_capabilities;
aoqi@0 36
aoqi@0 37 // capabilities which are always potentially available
aoqi@0 38 // but to only one environment
aoqi@0 39 jvmtiCapabilities JvmtiManageCapabilities::always_solo_capabilities;
aoqi@0 40
aoqi@0 41 // capabilities which are potentially available during OnLoad
aoqi@0 42 // but to only one environment
aoqi@0 43 jvmtiCapabilities JvmtiManageCapabilities::onload_solo_capabilities;
aoqi@0 44
aoqi@0 45 // remaining capabilities which are always potentially available
aoqi@0 46 // but to only one environment
aoqi@0 47 jvmtiCapabilities JvmtiManageCapabilities::always_solo_remaining_capabilities;
aoqi@0 48
aoqi@0 49 // remaining capabilities which are potentially available during OnLoad
aoqi@0 50 // but to only one environment
aoqi@0 51 jvmtiCapabilities JvmtiManageCapabilities::onload_solo_remaining_capabilities;
aoqi@0 52
aoqi@0 53 // all capabilities ever acquired
aoqi@0 54 jvmtiCapabilities JvmtiManageCapabilities::acquired_capabilities;
aoqi@0 55
aoqi@0 56 void JvmtiManageCapabilities::initialize() {
aoqi@0 57 always_capabilities = init_always_capabilities();
aoqi@0 58 if (JvmtiEnv::get_phase() != JVMTI_PHASE_ONLOAD) {
aoqi@0 59 recompute_always_capabilities();
aoqi@0 60 }
aoqi@0 61 onload_capabilities = init_onload_capabilities();
aoqi@0 62 always_solo_capabilities = init_always_solo_capabilities();
aoqi@0 63 onload_solo_capabilities = init_onload_solo_capabilities();
aoqi@0 64 always_solo_remaining_capabilities = init_always_solo_capabilities();
aoqi@0 65 onload_solo_remaining_capabilities = init_onload_solo_capabilities();
aoqi@0 66 memset(&acquired_capabilities, 0, sizeof(acquired_capabilities));
aoqi@0 67 }
aoqi@0 68
aoqi@0 69 // if the capability sets are initialized in the onload phase then
aoqi@0 70 // it happens before class data sharing (CDS) is initialized. If it
aoqi@0 71 // turns out that CDS gets disabled then we must adjust the always
aoqi@0 72 // capabilities. To ensure a consistent view of the capabililties
aoqi@0 73 // anything we add here should already be in the onload set.
aoqi@0 74 void JvmtiManageCapabilities::recompute_always_capabilities() {
aoqi@0 75 if (!UseSharedSpaces) {
aoqi@0 76 jvmtiCapabilities jc = always_capabilities;
aoqi@0 77 jc.can_generate_all_class_hook_events = 1;
aoqi@0 78 always_capabilities = jc;
aoqi@0 79 }
aoqi@0 80 }
aoqi@0 81
aoqi@0 82
aoqi@0 83 // corresponding init functions
aoqi@0 84 jvmtiCapabilities JvmtiManageCapabilities::init_always_capabilities() {
aoqi@0 85 jvmtiCapabilities jc;
aoqi@0 86
aoqi@0 87 memset(&jc, 0, sizeof(jc));
aoqi@0 88 jc.can_get_bytecodes = 1;
aoqi@0 89 jc.can_signal_thread = 1;
aoqi@0 90 jc.can_get_source_file_name = 1;
aoqi@0 91 jc.can_get_line_numbers = 1;
aoqi@0 92 jc.can_get_synthetic_attribute = 1;
aoqi@0 93 jc.can_get_monitor_info = 1;
aoqi@0 94 jc.can_get_constant_pool = 1;
aoqi@0 95 jc.can_generate_monitor_events = 1;
aoqi@0 96 jc.can_generate_garbage_collection_events = 1;
aoqi@0 97 jc.can_generate_compiled_method_load_events = 1;
aoqi@0 98 jc.can_generate_native_method_bind_events = 1;
aoqi@0 99 jc.can_generate_vm_object_alloc_events = 1;
aoqi@0 100 if (os::is_thread_cpu_time_supported()) {
aoqi@0 101 jc.can_get_current_thread_cpu_time = 1;
aoqi@0 102 jc.can_get_thread_cpu_time = 1;
aoqi@0 103 }
aoqi@0 104 jc.can_redefine_classes = 1;
aoqi@0 105 jc.can_redefine_any_class = 1;
aoqi@0 106 jc.can_retransform_classes = 1;
aoqi@0 107 jc.can_retransform_any_class = 1;
aoqi@0 108 jc.can_set_native_method_prefix = 1;
aoqi@0 109 jc.can_tag_objects = 1;
aoqi@0 110 jc.can_generate_object_free_events = 1;
aoqi@0 111 jc.can_generate_resource_exhaustion_heap_events = 1;
aoqi@0 112 jc.can_generate_resource_exhaustion_threads_events = 1;
aoqi@0 113 return jc;
aoqi@0 114 }
aoqi@0 115
aoqi@0 116 jvmtiCapabilities JvmtiManageCapabilities::init_onload_capabilities() {
aoqi@0 117 jvmtiCapabilities jc;
aoqi@0 118
aoqi@0 119 memset(&jc, 0, sizeof(jc));
aoqi@0 120 #ifndef ZERO
aoqi@0 121 jc.can_pop_frame = 1;
aoqi@0 122 jc.can_force_early_return = 1;
aoqi@0 123 #endif // !ZERO
aoqi@0 124 jc.can_get_source_debug_extension = 1;
aoqi@0 125 jc.can_access_local_variables = 1;
aoqi@0 126 jc.can_maintain_original_method_order = 1;
aoqi@0 127 jc.can_generate_all_class_hook_events = 1;
aoqi@0 128 jc.can_generate_single_step_events = 1;
aoqi@0 129 jc.can_generate_exception_events = 1;
aoqi@0 130 jc.can_generate_frame_pop_events = 1;
aoqi@0 131 jc.can_generate_method_entry_events = 1;
aoqi@0 132 jc.can_generate_method_exit_events = 1;
aoqi@0 133 jc.can_get_owned_monitor_info = 1;
aoqi@0 134 jc.can_get_owned_monitor_stack_depth_info = 1;
aoqi@0 135 jc.can_get_current_contended_monitor = 1;
aoqi@0 136 // jc.can_get_monitor_info = 1;
aoqi@0 137 jc.can_tag_objects = 1; // TODO: this should have been removed
aoqi@0 138 jc.can_generate_object_free_events = 1; // TODO: this should have been removed
aoqi@0 139 return jc;
aoqi@0 140 }
aoqi@0 141
aoqi@0 142
aoqi@0 143 jvmtiCapabilities JvmtiManageCapabilities::init_always_solo_capabilities() {
aoqi@0 144 jvmtiCapabilities jc;
aoqi@0 145
aoqi@0 146 memset(&jc, 0, sizeof(jc));
aoqi@0 147 jc.can_suspend = 1;
aoqi@0 148 return jc;
aoqi@0 149 }
aoqi@0 150
aoqi@0 151
aoqi@0 152 jvmtiCapabilities JvmtiManageCapabilities::init_onload_solo_capabilities() {
aoqi@0 153 jvmtiCapabilities jc;
aoqi@0 154
aoqi@0 155 memset(&jc, 0, sizeof(jc));
aoqi@0 156 jc.can_generate_field_modification_events = 1;
aoqi@0 157 jc.can_generate_field_access_events = 1;
aoqi@0 158 jc.can_generate_breakpoint_events = 1;
aoqi@0 159 return jc;
aoqi@0 160 }
aoqi@0 161
aoqi@0 162
aoqi@0 163 jvmtiCapabilities *JvmtiManageCapabilities::either(const jvmtiCapabilities *a, const jvmtiCapabilities *b,
aoqi@0 164 jvmtiCapabilities *result) {
aoqi@0 165 char *ap = (char *)a;
aoqi@0 166 char *bp = (char *)b;
aoqi@0 167 char *resultp = (char *)result;
aoqi@0 168
aoqi@0 169 for (int i = 0; i < CAPA_SIZE; ++i) {
aoqi@0 170 *resultp++ = *ap++ | *bp++;
aoqi@0 171 }
aoqi@0 172
aoqi@0 173 return result;
aoqi@0 174 }
aoqi@0 175
aoqi@0 176
aoqi@0 177 jvmtiCapabilities *JvmtiManageCapabilities::both(const jvmtiCapabilities *a, const jvmtiCapabilities *b,
aoqi@0 178 jvmtiCapabilities *result) {
aoqi@0 179 char *ap = (char *)a;
aoqi@0 180 char *bp = (char *)b;
aoqi@0 181 char *resultp = (char *)result;
aoqi@0 182
aoqi@0 183 for (int i = 0; i < CAPA_SIZE; ++i) {
aoqi@0 184 *resultp++ = *ap++ & *bp++;
aoqi@0 185 }
aoqi@0 186
aoqi@0 187 return result;
aoqi@0 188 }
aoqi@0 189
aoqi@0 190
aoqi@0 191 jvmtiCapabilities *JvmtiManageCapabilities::exclude(const jvmtiCapabilities *a, const jvmtiCapabilities *b,
aoqi@0 192 jvmtiCapabilities *result) {
aoqi@0 193 char *ap = (char *)a;
aoqi@0 194 char *bp = (char *)b;
aoqi@0 195 char *resultp = (char *)result;
aoqi@0 196
aoqi@0 197 for (int i = 0; i < CAPA_SIZE; ++i) {
aoqi@0 198 *resultp++ = *ap++ & ~*bp++;
aoqi@0 199 }
aoqi@0 200
aoqi@0 201 return result;
aoqi@0 202 }
aoqi@0 203
aoqi@0 204
aoqi@0 205 bool JvmtiManageCapabilities::has_some(const jvmtiCapabilities *a) {
aoqi@0 206 char *ap = (char *)a;
aoqi@0 207
aoqi@0 208 for (int i = 0; i < CAPA_SIZE; ++i) {
aoqi@0 209 if (*ap++ != 0) {
aoqi@0 210 return true;
aoqi@0 211 }
aoqi@0 212 }
aoqi@0 213
aoqi@0 214 return false;
aoqi@0 215 }
aoqi@0 216
aoqi@0 217
aoqi@0 218 void JvmtiManageCapabilities::copy_capabilities(const jvmtiCapabilities *from, jvmtiCapabilities *to) {
aoqi@0 219 char *ap = (char *)from;
aoqi@0 220 char *resultp = (char *)to;
aoqi@0 221
aoqi@0 222 for (int i = 0; i < CAPA_SIZE; ++i) {
aoqi@0 223 *resultp++ = *ap++;
aoqi@0 224 }
aoqi@0 225 }
aoqi@0 226
aoqi@0 227
aoqi@0 228 void JvmtiManageCapabilities::get_potential_capabilities(const jvmtiCapabilities *current,
aoqi@0 229 const jvmtiCapabilities *prohibited,
aoqi@0 230 jvmtiCapabilities *result) {
aoqi@0 231 // exclude prohibited capabilities, must be before adding current
aoqi@0 232 exclude(&always_capabilities, prohibited, result);
aoqi@0 233
aoqi@0 234 // must include current since it may possess solo capabilities and now prohibited
aoqi@0 235 either(result, current, result);
aoqi@0 236
aoqi@0 237 // add other remaining
aoqi@0 238 either(result, &always_solo_remaining_capabilities, result);
aoqi@0 239
aoqi@0 240 // if this is during OnLoad more capabilities are available
aoqi@0 241 if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
aoqi@0 242 either(result, &onload_capabilities, result);
aoqi@0 243 either(result, &onload_solo_remaining_capabilities, result);
aoqi@0 244 }
aoqi@0 245 }
aoqi@0 246
aoqi@0 247 jvmtiError JvmtiManageCapabilities::add_capabilities(const jvmtiCapabilities *current,
aoqi@0 248 const jvmtiCapabilities *prohibited,
aoqi@0 249 const jvmtiCapabilities *desired,
aoqi@0 250 jvmtiCapabilities *result) {
aoqi@0 251 // check that the capabilities being added are potential capabilities
aoqi@0 252 jvmtiCapabilities temp;
aoqi@0 253 get_potential_capabilities(current, prohibited, &temp);
aoqi@0 254 if (has_some(exclude(desired, &temp, &temp))) {
aoqi@0 255 return JVMTI_ERROR_NOT_AVAILABLE;
aoqi@0 256 }
aoqi@0 257
aoqi@0 258 // add to the set of ever acquired capabilities
aoqi@0 259 either(&acquired_capabilities, desired, &acquired_capabilities);
aoqi@0 260
aoqi@0 261 // onload capabilities that got added are now permanent - so, also remove from onload
aoqi@0 262 both(&onload_capabilities, desired, &temp);
aoqi@0 263 either(&always_capabilities, &temp, &always_capabilities);
aoqi@0 264 exclude(&onload_capabilities, &temp, &onload_capabilities);
aoqi@0 265
aoqi@0 266 // same for solo capabilities (transferred capabilities in the remaining sets handled as part of standard grab - below)
aoqi@0 267 both(&onload_solo_capabilities, desired, &temp);
aoqi@0 268 either(&always_solo_capabilities, &temp, &always_solo_capabilities);
aoqi@0 269 exclude(&onload_solo_capabilities, &temp, &onload_solo_capabilities);
aoqi@0 270
aoqi@0 271 // remove solo capabilities that are now taken
aoqi@0 272 exclude(&always_solo_remaining_capabilities, desired, &always_solo_remaining_capabilities);
aoqi@0 273 exclude(&onload_solo_remaining_capabilities, desired, &onload_solo_remaining_capabilities);
aoqi@0 274
aoqi@0 275 // return the result
aoqi@0 276 either(current, desired, result);
aoqi@0 277
aoqi@0 278 update();
aoqi@0 279
aoqi@0 280 return JVMTI_ERROR_NONE;
aoqi@0 281 }
aoqi@0 282
aoqi@0 283
aoqi@0 284 void JvmtiManageCapabilities::relinquish_capabilities(const jvmtiCapabilities *current,
aoqi@0 285 const jvmtiCapabilities *unwanted,
aoqi@0 286 jvmtiCapabilities *result) {
aoqi@0 287 jvmtiCapabilities to_trash;
aoqi@0 288 jvmtiCapabilities temp;
aoqi@0 289
aoqi@0 290 // can't give up what you don't have
aoqi@0 291 both(current, unwanted, &to_trash);
aoqi@0 292
aoqi@0 293 // restore solo capabilities but only those that belong
aoqi@0 294 either(&always_solo_remaining_capabilities, both(&always_solo_capabilities, &to_trash, &temp),
aoqi@0 295 &always_solo_remaining_capabilities);
aoqi@0 296 either(&onload_solo_remaining_capabilities, both(&onload_solo_capabilities, &to_trash, &temp),
aoqi@0 297 &onload_solo_remaining_capabilities);
aoqi@0 298
aoqi@0 299 update();
aoqi@0 300
aoqi@0 301 // return the result
aoqi@0 302 exclude(current, unwanted, result);
aoqi@0 303 }
aoqi@0 304
aoqi@0 305
aoqi@0 306 void JvmtiManageCapabilities::update() {
aoqi@0 307 jvmtiCapabilities avail;
aoqi@0 308
aoqi@0 309 // all capabilities
aoqi@0 310 either(&always_capabilities, &always_solo_capabilities, &avail);
aoqi@0 311
aoqi@0 312 bool interp_events =
aoqi@0 313 avail.can_generate_field_access_events ||
aoqi@0 314 avail.can_generate_field_modification_events ||
aoqi@0 315 avail.can_generate_single_step_events ||
aoqi@0 316 avail.can_generate_frame_pop_events ||
aoqi@0 317 avail.can_generate_method_entry_events ||
aoqi@0 318 avail.can_generate_method_exit_events;
aoqi@0 319 bool enter_all_methods =
aoqi@0 320 interp_events ||
aoqi@0 321 avail.can_generate_breakpoint_events;
aoqi@0 322 if (enter_all_methods) {
aoqi@0 323 // Disable these when tracking the bytecodes
aoqi@0 324 UseFastEmptyMethods = false;
aoqi@0 325 UseFastAccessorMethods = false;
aoqi@0 326 }
aoqi@0 327
aoqi@0 328 if (avail.can_generate_breakpoint_events) {
aoqi@0 329 RewriteFrequentPairs = false;
aoqi@0 330 }
aoqi@0 331
aoqi@0 332 // If can_redefine_classes is enabled in the onload phase then we know that the
aoqi@0 333 // dependency information recorded by the compiler is complete.
aoqi@0 334 if ((avail.can_redefine_classes || avail.can_retransform_classes) &&
aoqi@0 335 JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
aoqi@0 336 JvmtiExport::set_all_dependencies_are_recorded(true);
aoqi@0 337 }
aoqi@0 338
aoqi@0 339 JvmtiExport::set_can_get_source_debug_extension(avail.can_get_source_debug_extension);
aoqi@0 340 JvmtiExport::set_can_maintain_original_method_order(avail.can_maintain_original_method_order);
aoqi@0 341 JvmtiExport::set_can_post_interpreter_events(interp_events);
aoqi@0 342 JvmtiExport::set_can_hotswap_or_post_breakpoint(
aoqi@0 343 avail.can_generate_breakpoint_events ||
aoqi@0 344 avail.can_redefine_classes ||
aoqi@0 345 avail.can_retransform_classes);
aoqi@0 346 JvmtiExport::set_can_modify_any_class(
aoqi@0 347 avail.can_generate_breakpoint_events ||
aoqi@0 348 avail.can_generate_all_class_hook_events);
aoqi@0 349 JvmtiExport::set_can_walk_any_space(
aoqi@0 350 avail.can_tag_objects); // disable sharing in onload phase
aoqi@0 351 // This controls whether the compilers keep extra locals live to
aoqi@0 352 // improve the debugging experience so only set them if the selected
aoqi@0 353 // capabilities look like a debugger.
aoqi@0 354 JvmtiExport::set_can_access_local_variables(
aoqi@0 355 avail.can_access_local_variables ||
aoqi@0 356 avail.can_generate_breakpoint_events ||
aoqi@0 357 avail.can_generate_frame_pop_events);
aoqi@0 358 JvmtiExport::set_can_post_on_exceptions(
aoqi@0 359 avail.can_generate_exception_events ||
aoqi@0 360 avail.can_generate_frame_pop_events ||
aoqi@0 361 avail.can_generate_method_exit_events);
aoqi@0 362 JvmtiExport::set_can_post_breakpoint(avail.can_generate_breakpoint_events);
aoqi@0 363 JvmtiExport::set_can_post_field_access(avail.can_generate_field_access_events);
aoqi@0 364 JvmtiExport::set_can_post_field_modification(avail.can_generate_field_modification_events);
aoqi@0 365 JvmtiExport::set_can_post_method_entry(avail.can_generate_method_entry_events);
aoqi@0 366 JvmtiExport::set_can_post_method_exit(avail.can_generate_method_exit_events ||
aoqi@0 367 avail.can_generate_frame_pop_events);
aoqi@0 368 JvmtiExport::set_can_pop_frame(avail.can_pop_frame);
aoqi@0 369 JvmtiExport::set_can_force_early_return(avail.can_force_early_return);
aoqi@0 370 JvmtiExport::set_should_clean_up_heap_objects(avail.can_generate_breakpoint_events);
aoqi@0 371 }
aoqi@0 372
aoqi@0 373 #ifndef PRODUCT
aoqi@0 374
aoqi@0 375 void JvmtiManageCapabilities:: print(const jvmtiCapabilities* cap) {
aoqi@0 376 tty->print_cr("----- capabilities -----");
aoqi@0 377 if (cap->can_tag_objects)
aoqi@0 378 tty->print_cr("can_tag_objects");
aoqi@0 379 if (cap->can_generate_field_modification_events)
aoqi@0 380 tty->print_cr("can_generate_field_modification_events");
aoqi@0 381 if (cap->can_generate_field_access_events)
aoqi@0 382 tty->print_cr("can_generate_field_access_events");
aoqi@0 383 if (cap->can_get_bytecodes)
aoqi@0 384 tty->print_cr("can_get_bytecodes");
aoqi@0 385 if (cap->can_get_synthetic_attribute)
aoqi@0 386 tty->print_cr("can_get_synthetic_attribute");
aoqi@0 387 if (cap->can_get_owned_monitor_info)
aoqi@0 388 tty->print_cr("can_get_owned_monitor_info");
aoqi@0 389 if (cap->can_get_current_contended_monitor)
aoqi@0 390 tty->print_cr("can_get_current_contended_monitor");
aoqi@0 391 if (cap->can_get_monitor_info)
aoqi@0 392 tty->print_cr("can_get_monitor_info");
aoqi@0 393 if (cap->can_get_constant_pool)
aoqi@0 394 tty->print_cr("can_get_constant_pool");
aoqi@0 395 if (cap->can_pop_frame)
aoqi@0 396 tty->print_cr("can_pop_frame");
aoqi@0 397 if (cap->can_force_early_return)
aoqi@0 398 tty->print_cr("can_force_early_return");
aoqi@0 399 if (cap->can_redefine_classes)
aoqi@0 400 tty->print_cr("can_redefine_classes");
aoqi@0 401 if (cap->can_retransform_classes)
aoqi@0 402 tty->print_cr("can_retransform_classes");
aoqi@0 403 if (cap->can_signal_thread)
aoqi@0 404 tty->print_cr("can_signal_thread");
aoqi@0 405 if (cap->can_get_source_file_name)
aoqi@0 406 tty->print_cr("can_get_source_file_name");
aoqi@0 407 if (cap->can_get_line_numbers)
aoqi@0 408 tty->print_cr("can_get_line_numbers");
aoqi@0 409 if (cap->can_get_source_debug_extension)
aoqi@0 410 tty->print_cr("can_get_source_debug_extension");
aoqi@0 411 if (cap->can_access_local_variables)
aoqi@0 412 tty->print_cr("can_access_local_variables");
aoqi@0 413 if (cap->can_maintain_original_method_order)
aoqi@0 414 tty->print_cr("can_maintain_original_method_order");
aoqi@0 415 if (cap->can_generate_single_step_events)
aoqi@0 416 tty->print_cr("can_generate_single_step_events");
aoqi@0 417 if (cap->can_generate_exception_events)
aoqi@0 418 tty->print_cr("can_generate_exception_events");
aoqi@0 419 if (cap->can_generate_frame_pop_events)
aoqi@0 420 tty->print_cr("can_generate_frame_pop_events");
aoqi@0 421 if (cap->can_generate_breakpoint_events)
aoqi@0 422 tty->print_cr("can_generate_breakpoint_events");
aoqi@0 423 if (cap->can_suspend)
aoqi@0 424 tty->print_cr("can_suspend");
aoqi@0 425 if (cap->can_redefine_any_class )
aoqi@0 426 tty->print_cr("can_redefine_any_class");
aoqi@0 427 if (cap->can_retransform_any_class )
aoqi@0 428 tty->print_cr("can_retransform_any_class");
aoqi@0 429 if (cap->can_get_current_thread_cpu_time)
aoqi@0 430 tty->print_cr("can_get_current_thread_cpu_time");
aoqi@0 431 if (cap->can_get_thread_cpu_time)
aoqi@0 432 tty->print_cr("can_get_thread_cpu_time");
aoqi@0 433 if (cap->can_generate_method_entry_events)
aoqi@0 434 tty->print_cr("can_generate_method_entry_events");
aoqi@0 435 if (cap->can_generate_method_exit_events)
aoqi@0 436 tty->print_cr("can_generate_method_exit_events");
aoqi@0 437 if (cap->can_generate_all_class_hook_events)
aoqi@0 438 tty->print_cr("can_generate_all_class_hook_events");
aoqi@0 439 if (cap->can_generate_compiled_method_load_events)
aoqi@0 440 tty->print_cr("can_generate_compiled_method_load_events");
aoqi@0 441 if (cap->can_generate_monitor_events)
aoqi@0 442 tty->print_cr("can_generate_monitor_events");
aoqi@0 443 if (cap->can_generate_vm_object_alloc_events)
aoqi@0 444 tty->print_cr("can_generate_vm_object_alloc_events");
aoqi@0 445 if (cap->can_generate_native_method_bind_events)
aoqi@0 446 tty->print_cr("can_generate_native_method_bind_events");
aoqi@0 447 if (cap->can_generate_garbage_collection_events)
aoqi@0 448 tty->print_cr("can_generate_garbage_collection_events");
aoqi@0 449 if (cap->can_generate_object_free_events)
aoqi@0 450 tty->print_cr("can_generate_object_free_events");
aoqi@0 451 if (cap->can_generate_resource_exhaustion_heap_events)
aoqi@0 452 tty->print_cr("can_generate_resource_exhaustion_heap_events");
aoqi@0 453 if (cap->can_generate_resource_exhaustion_threads_events)
aoqi@0 454 tty->print_cr("can_generate_resource_exhaustion_threads_events");
aoqi@0 455 }
aoqi@0 456
aoqi@0 457 #endif

mercurial