1 /* 2 * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "classfile/javaClasses.inline.hpp" 27 #include "classfile/moduleEntry.hpp" 28 #include "classfile/vmClasses.hpp" 29 #include "classfile/vmSymbols.hpp" 30 #include "code/nmethod.hpp" 31 #include "code/pcDesc.hpp" 32 #include "code/scopeDesc.hpp" 33 #include "gc/shared/oopStorageSet.hpp" 34 #include "interpreter/interpreter.hpp" 35 #include "jvmtifiles/jvmtiEnv.hpp" 36 #include "logging/log.hpp" 37 #include "logging/logStream.hpp" 38 #include "memory/allocation.inline.hpp" 39 #include "memory/resourceArea.hpp" 40 #include "memory/universe.hpp" 41 #include "oops/klass.inline.hpp" 42 #include "oops/objArrayKlass.hpp" 43 #include "oops/objArrayOop.hpp" 44 #include "oops/oop.inline.hpp" 45 #include "oops/oopHandle.inline.hpp" 46 #include "prims/jvmtiAgentList.hpp" 47 #include "prims/jvmtiCodeBlobEvents.hpp" 48 #include "prims/jvmtiEventController.hpp" 49 #include "prims/jvmtiEventController.inline.hpp" 50 #include "prims/jvmtiExport.hpp" 51 #include "prims/jvmtiImpl.hpp" 52 #include "prims/jvmtiManageCapabilities.hpp" 53 #include "prims/jvmtiRawMonitor.hpp" 54 #include "prims/jvmtiRedefineClasses.hpp" 55 #include "prims/jvmtiTagMap.hpp" 56 #include "prims/jvmtiThreadState.inline.hpp" 57 #include "runtime/arguments.hpp" 58 #include "runtime/fieldDescriptor.inline.hpp" 59 #include "runtime/handles.inline.hpp" 60 #include "runtime/interfaceSupport.inline.hpp" 61 #include "runtime/javaCalls.hpp" 62 #include "runtime/javaThread.hpp" 63 #include "runtime/jniHandles.inline.hpp" 64 #include "runtime/keepStackGCProcessed.hpp" 65 #include "runtime/objectMonitor.hpp" 66 #include "runtime/objectMonitor.inline.hpp" 67 #include "runtime/os.hpp" 68 #include "runtime/osThread.hpp" 69 #include "runtime/safepointVerifiers.hpp" 70 #include "runtime/serviceThread.hpp" 71 #include "runtime/threads.hpp" 72 #include "runtime/threadSMR.hpp" 73 #include "runtime/vframe.inline.hpp" 74 #include "runtime/vm_version.hpp" 75 #include "utilities/macros.hpp" 76 77 #ifdef JVMTI_TRACE 78 #define EVT_TRACE(evt,out) if ((JvmtiTrace::event_trace_flags(evt) & JvmtiTrace::SHOW_EVENT_SENT) != 0) { SafeResourceMark rm; log_trace(jvmti) out; } 79 #define EVT_TRIG_TRACE(evt,out) if ((JvmtiTrace::event_trace_flags(evt) & JvmtiTrace::SHOW_EVENT_TRIGGER) != 0) { SafeResourceMark rm; log_trace(jvmti) out; } 80 #else 81 #define EVT_TRIG_TRACE(evt,out) 82 #define EVT_TRACE(evt,out) 83 #endif 84 85 /////////////////////////////////////////////////////////////// 86 // 87 // JvmtiEventTransition 88 // 89 // TO DO -- 90 // more handle purging 91 92 // Use this for JavaThreads and state is _thread_in_vm. 93 class JvmtiJavaThreadEventTransition : StackObj { 94 private: 95 ResourceMark _rm; 96 ThreadToNativeFromVM _transition; 97 HandleMark _hm; 98 99 public: 100 JvmtiJavaThreadEventTransition(JavaThread *thread) : 101 _rm(), 102 _transition(thread), 103 _hm(thread) {}; 104 }; 105 106 // For JavaThreads which are not in _thread_in_vm state 107 // and other system threads use this. 108 class JvmtiThreadEventTransition : StackObj { 109 private: 110 ResourceMark _rm; 111 HandleMark _hm; 112 JavaThreadState _saved_state; 113 JavaThread *_jthread; 114 115 public: 116 JvmtiThreadEventTransition(Thread *thread) : _rm(), _hm(thread) { 117 if (thread->is_Java_thread()) { 118 _jthread = JavaThread::cast(thread); 119 _saved_state = _jthread->thread_state(); 120 if (_saved_state == _thread_in_Java) { 121 ThreadStateTransition::transition_from_java(_jthread, _thread_in_native); 122 } else { 123 ThreadStateTransition::transition_from_vm(_jthread, _thread_in_native); 124 } 125 } else { 126 _jthread = nullptr; 127 } 128 } 129 130 ~JvmtiThreadEventTransition() { 131 if (_jthread != nullptr) 132 ThreadStateTransition::transition_from_native(_jthread, _saved_state); 133 } 134 }; 135 136 137 /////////////////////////////////////////////////////////////// 138 // 139 // JvmtiEventMark 140 // 141 142 class JvmtiEventMark : public StackObj { 143 private: 144 JavaThread *_thread; 145 JNIEnv* _jni_env; 146 JvmtiThreadState::ExceptionState _saved_exception_state; 147 148 public: 149 JvmtiEventMark(JavaThread *thread) : _thread(thread), 150 _jni_env(thread->jni_environment()), 151 _saved_exception_state(JvmtiThreadState::ES_CLEARED) { 152 JvmtiThreadState *state = thread->jvmti_thread_state(); 153 // we are before an event. 154 // Save current jvmti thread exception state. 155 if (state != nullptr) { 156 _saved_exception_state = state->get_exception_state(); 157 } 158 159 thread->push_jni_handle_block(); 160 assert(thread == JavaThread::current(), "thread must be current!"); 161 thread->frame_anchor()->make_walkable(); 162 }; 163 164 ~JvmtiEventMark() { 165 _thread->pop_jni_handle_block(); 166 167 JvmtiThreadState* state = _thread->jvmti_thread_state(); 168 // we are continuing after an event. 169 if (state != nullptr) { 170 // Restore the jvmti thread exception state. 171 state->restore_exception_state(_saved_exception_state); 172 } 173 } 174 175 jobject to_jobject(oop obj) { return JNIHandles::make_local(_thread,obj); } 176 177 jclass to_jclass(Klass* klass) { return (klass == nullptr ? nullptr : (jclass)to_jobject(klass->java_mirror())); } 178 179 jmethodID to_jmethodID(const methodHandle& method) { return method->jmethod_id(); } 180 181 JNIEnv* jni_env() { return _jni_env; } 182 }; 183 184 class JvmtiThreadEventMark : public JvmtiEventMark { 185 private: 186 jobject _jthread; 187 188 public: 189 JvmtiThreadEventMark(JavaThread *thread) : 190 JvmtiEventMark(thread) { 191 _jthread = to_jobject(thread->threadObj()); 192 }; 193 jthread jni_thread() { return (jthread)_jthread; } 194 }; 195 196 class JvmtiVirtualThreadEventMark : public JvmtiEventMark { 197 private: 198 jobject _jthread; 199 200 public: 201 JvmtiVirtualThreadEventMark(JavaThread *thread) : 202 JvmtiEventMark(thread) { 203 assert(thread->vthread() != nullptr || thread->threadObj() == nullptr, "sanity check"); 204 _jthread = to_jobject(thread->vthread()); 205 }; 206 jthread jni_thread() { return (jthread)_jthread; } 207 }; 208 209 class JvmtiClassEventMark : public JvmtiVirtualThreadEventMark { 210 private: 211 jclass _jc; 212 213 public: 214 JvmtiClassEventMark(JavaThread *thread, Klass* klass) : 215 JvmtiVirtualThreadEventMark(thread) { 216 _jc = to_jclass(klass); 217 }; 218 jclass jni_class() { return _jc; } 219 }; 220 221 class JvmtiMethodEventMark : public JvmtiVirtualThreadEventMark { 222 private: 223 jmethodID _mid; 224 225 public: 226 JvmtiMethodEventMark(JavaThread *thread, const methodHandle& method) : 227 JvmtiVirtualThreadEventMark(thread), 228 _mid(to_jmethodID(method)) {}; 229 jmethodID jni_methodID() { return _mid; } 230 }; 231 232 class JvmtiLocationEventMark : public JvmtiMethodEventMark { 233 private: 234 jlocation _loc; 235 236 public: 237 JvmtiLocationEventMark(JavaThread *thread, const methodHandle& method, address location) : 238 JvmtiMethodEventMark(thread, method), 239 _loc(location - method->code_base()) {}; 240 jlocation location() { return _loc; } 241 }; 242 243 class JvmtiExceptionEventMark : public JvmtiLocationEventMark { 244 private: 245 jobject _exc; 246 247 public: 248 JvmtiExceptionEventMark(JavaThread *thread, const methodHandle& method, address location, Handle exception) : 249 JvmtiLocationEventMark(thread, method, location), 250 _exc(to_jobject(exception())) {}; 251 jobject exception() { return _exc; } 252 }; 253 254 class JvmtiClassFileLoadEventMark : public JvmtiThreadEventMark { 255 private: 256 const char *_class_name; 257 jobject _jloader; 258 jobject _protection_domain; 259 jclass _class_being_redefined; 260 261 public: 262 JvmtiClassFileLoadEventMark(JavaThread *thread, Symbol* name, 263 Handle class_loader, Handle prot_domain, Klass* class_being_redefined) : JvmtiThreadEventMark(thread) { 264 _class_name = name != nullptr? name->as_utf8() : nullptr; 265 _jloader = (jobject)to_jobject(class_loader()); 266 _protection_domain = (jobject)to_jobject(prot_domain()); 267 if (class_being_redefined == nullptr) { 268 _class_being_redefined = nullptr; 269 } else { 270 _class_being_redefined = (jclass)to_jclass(class_being_redefined); 271 } 272 }; 273 const char *class_name() { 274 return _class_name; 275 } 276 jobject jloader() { 277 return _jloader; 278 } 279 jobject protection_domain() { 280 return _protection_domain; 281 } 282 jclass class_being_redefined() { 283 return _class_being_redefined; 284 } 285 }; 286 287 ////////////////////////////////////////////////////////////////////////////// 288 289 int JvmtiExport::_field_access_count = 0; 290 int JvmtiExport::_field_modification_count = 0; 291 292 bool JvmtiExport::_can_access_local_variables = false; 293 bool JvmtiExport::_can_hotswap_or_post_breakpoint = false; 294 bool JvmtiExport::_can_modify_any_class = false; 295 bool JvmtiExport::_can_walk_any_space = false; 296 297 uint64_t JvmtiExport::_redefinition_count = 0; 298 bool JvmtiExport::_all_dependencies_are_recorded = false; 299 300 // 301 // field access management 302 // 303 304 // interpreter generator needs the address of the counter 305 address JvmtiExport::get_field_access_count_addr() { 306 // We don't grab a lock because we don't want to 307 // serialize field access between all threads. This means that a 308 // thread on another processor can see the wrong count value and 309 // may either miss making a needed call into post_field_access() 310 // or will make an unneeded call into post_field_access(). We pay 311 // this price to avoid slowing down the VM when we aren't watching 312 // field accesses. 313 // Other access/mutation safe by virtue of being in VM state. 314 return (address)(&_field_access_count); 315 } 316 317 // 318 // field modification management 319 // 320 321 // interpreter generator needs the address of the counter 322 address JvmtiExport::get_field_modification_count_addr() { 323 // We don't grab a lock because we don't 324 // want to serialize field modification between all threads. This 325 // means that a thread on another processor can see the wrong 326 // count value and may either miss making a needed call into 327 // post_field_modification() or will make an unneeded call into 328 // post_field_modification(). We pay this price to avoid slowing 329 // down the VM when we aren't watching field modifications. 330 // Other access/mutation safe by virtue of being in VM state. 331 return (address)(&_field_modification_count); 332 } 333 334 335 /////////////////////////////////////////////////////////////// 336 // Functions needed by java.lang.instrument for starting up javaagent. 337 /////////////////////////////////////////////////////////////// 338 339 jint 340 JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) { 341 // The JVMTI_VERSION_INTERFACE_JVMTI part of the version number 342 // has already been validated in JNI GetEnv(). 343 int major, minor, micro; 344 345 // micro version doesn't matter here (yet?) 346 decode_version_values(version, &major, &minor, µ); 347 switch (major) { 348 case 1: 349 switch (minor) { 350 case 0: // version 1.0.<micro> is recognized 351 case 1: // version 1.1.<micro> is recognized 352 case 2: // version 1.2.<micro> is recognized 353 break; 354 355 default: 356 return JNI_EVERSION; // unsupported minor version number 357 } 358 break; 359 case 9: 360 switch (minor) { 361 case 0: // version 9.0.<micro> is recognized 362 break; 363 default: 364 return JNI_EVERSION; // unsupported minor version number 365 } 366 break; 367 case 11: 368 switch (minor) { 369 case 0: // version 11.0.<micro> is recognized 370 break; 371 default: 372 return JNI_EVERSION; // unsupported minor version number 373 } 374 break; 375 default: 376 // Starting from 13 we do not care about minor version anymore 377 if (major < 13 || major > VM_Version::vm_major_version()) { 378 return JNI_EVERSION; // unsupported major version number 379 } 380 } 381 382 if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) { 383 JavaThread* current_thread = JavaThread::current(); 384 // transition code: native to VM 385 MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, current_thread)); 386 ThreadInVMfromNative __tiv(current_thread); 387 VM_ENTRY_BASE(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread) 388 debug_only(VMNativeEntryWrapper __vew;) 389 390 JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version); 391 *penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv* 392 393 if (Continuations::enabled()) { 394 // Virtual threads support for agents loaded into running VM. 395 // There is a performance impact when VTMS transitions are enabled. 396 if (!JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) { 397 JvmtiEnvBase::enable_virtual_threads_notify_jvmti(); 398 } 399 } 400 return JNI_OK; 401 402 } else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) { 403 // not live, no thread to transition 404 JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version); 405 *penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv* 406 407 if (Continuations::enabled()) { 408 // Virtual threads support for agents loaded at startup. 409 // There is a performance impact when VTMS transitions are enabled. 410 JvmtiVTMSTransitionDisabler::set_VTMS_notify_jvmti_events(true); 411 } 412 return JNI_OK; 413 414 } else { 415 // Called at the wrong time 416 *penv = nullptr; 417 return JNI_EDETACHED; 418 } 419 } 420 421 JvmtiThreadState* 422 JvmtiExport::get_jvmti_thread_state(JavaThread *thread) { 423 assert(thread == JavaThread::current(), "must be current thread"); 424 if (thread->is_vthread_mounted() && thread->jvmti_thread_state() == nullptr) { 425 JvmtiEventController::thread_started(thread); 426 } 427 return thread->jvmti_thread_state(); 428 } 429 430 void 431 JvmtiExport::add_default_read_edges(Handle h_module, TRAPS) { 432 if (!Universe::is_module_initialized()) { 433 return; // extra safety 434 } 435 assert(!h_module.is_null(), "module should always be set"); 436 437 // Invoke the transformedByAgent method 438 JavaValue result(T_VOID); 439 JavaCalls::call_static(&result, 440 vmClasses::module_Modules_klass(), 441 vmSymbols::transformedByAgent_name(), 442 vmSymbols::transformedByAgent_signature(), 443 h_module, 444 THREAD); 445 446 if (HAS_PENDING_EXCEPTION) { 447 LogTarget(Trace, jvmti) log; 448 LogStream log_stream(log); 449 java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); 450 log_stream.cr(); 451 CLEAR_PENDING_EXCEPTION; 452 return; 453 } 454 } 455 456 jvmtiError 457 JvmtiExport::add_module_reads(Handle module, Handle to_module, TRAPS) { 458 if (!Universe::is_module_initialized()) { 459 return JVMTI_ERROR_NONE; // extra safety 460 } 461 assert(!module.is_null(), "module should always be set"); 462 assert(!to_module.is_null(), "to_module should always be set"); 463 464 // Invoke the addReads method 465 JavaValue result(T_VOID); 466 JavaCalls::call_static(&result, 467 vmClasses::module_Modules_klass(), 468 vmSymbols::addReads_name(), 469 vmSymbols::addReads_signature(), 470 module, 471 to_module, 472 THREAD); 473 474 if (HAS_PENDING_EXCEPTION) { 475 LogTarget(Trace, jvmti) log; 476 LogStream log_stream(log); 477 java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); 478 log_stream.cr(); 479 CLEAR_PENDING_EXCEPTION; 480 return JVMTI_ERROR_INTERNAL; 481 } 482 return JVMTI_ERROR_NONE; 483 } 484 485 jvmtiError 486 JvmtiExport::add_module_exports(Handle module, Handle pkg_name, Handle to_module, TRAPS) { 487 if (!Universe::is_module_initialized()) { 488 return JVMTI_ERROR_NONE; // extra safety 489 } 490 assert(!module.is_null(), "module should always be set"); 491 assert(!to_module.is_null(), "to_module should always be set"); 492 assert(!pkg_name.is_null(), "pkg_name should always be set"); 493 494 // Invoke the addExports method 495 JavaValue result(T_VOID); 496 JavaCalls::call_static(&result, 497 vmClasses::module_Modules_klass(), 498 vmSymbols::addExports_name(), 499 vmSymbols::addExports_signature(), 500 module, 501 pkg_name, 502 to_module, 503 THREAD); 504 505 if (HAS_PENDING_EXCEPTION) { 506 Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); 507 LogTarget(Trace, jvmti) log; 508 LogStream log_stream(log); 509 java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); 510 log_stream.cr(); 511 CLEAR_PENDING_EXCEPTION; 512 if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) { 513 return JVMTI_ERROR_ILLEGAL_ARGUMENT; 514 } 515 return JVMTI_ERROR_INTERNAL; 516 } 517 return JVMTI_ERROR_NONE; 518 } 519 520 jvmtiError 521 JvmtiExport::add_module_opens(Handle module, Handle pkg_name, Handle to_module, TRAPS) { 522 if (!Universe::is_module_initialized()) { 523 return JVMTI_ERROR_NONE; // extra safety 524 } 525 assert(!module.is_null(), "module should always be set"); 526 assert(!to_module.is_null(), "to_module should always be set"); 527 assert(!pkg_name.is_null(), "pkg_name should always be set"); 528 529 // Invoke the addOpens method 530 JavaValue result(T_VOID); 531 JavaCalls::call_static(&result, 532 vmClasses::module_Modules_klass(), 533 vmSymbols::addOpens_name(), 534 vmSymbols::addExports_signature(), 535 module, 536 pkg_name, 537 to_module, 538 THREAD); 539 540 if (HAS_PENDING_EXCEPTION) { 541 Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); 542 LogTarget(Trace, jvmti) log; 543 LogStream log_stream(log); 544 java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); 545 log_stream.cr(); 546 CLEAR_PENDING_EXCEPTION; 547 if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) { 548 return JVMTI_ERROR_ILLEGAL_ARGUMENT; 549 } 550 return JVMTI_ERROR_INTERNAL; 551 } 552 return JVMTI_ERROR_NONE; 553 } 554 555 jvmtiError 556 JvmtiExport::add_module_uses(Handle module, Handle service, TRAPS) { 557 if (!Universe::is_module_initialized()) { 558 return JVMTI_ERROR_NONE; // extra safety 559 } 560 assert(!module.is_null(), "module should always be set"); 561 assert(!service.is_null(), "service should always be set"); 562 563 // Invoke the addUses method 564 JavaValue result(T_VOID); 565 JavaCalls::call_static(&result, 566 vmClasses::module_Modules_klass(), 567 vmSymbols::addUses_name(), 568 vmSymbols::addUses_signature(), 569 module, 570 service, 571 THREAD); 572 573 if (HAS_PENDING_EXCEPTION) { 574 LogTarget(Trace, jvmti) log; 575 LogStream log_stream(log); 576 java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); 577 log_stream.cr(); 578 CLEAR_PENDING_EXCEPTION; 579 return JVMTI_ERROR_INTERNAL; 580 } 581 return JVMTI_ERROR_NONE; 582 } 583 584 jvmtiError 585 JvmtiExport::add_module_provides(Handle module, Handle service, Handle impl_class, TRAPS) { 586 if (!Universe::is_module_initialized()) { 587 return JVMTI_ERROR_NONE; // extra safety 588 } 589 assert(!module.is_null(), "module should always be set"); 590 assert(!service.is_null(), "service should always be set"); 591 assert(!impl_class.is_null(), "impl_class should always be set"); 592 593 // Invoke the addProvides method 594 JavaValue result(T_VOID); 595 JavaCalls::call_static(&result, 596 vmClasses::module_Modules_klass(), 597 vmSymbols::addProvides_name(), 598 vmSymbols::addProvides_signature(), 599 module, 600 service, 601 impl_class, 602 THREAD); 603 604 if (HAS_PENDING_EXCEPTION) { 605 LogTarget(Trace, jvmti) log; 606 LogStream log_stream(log); 607 java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); 608 log_stream.cr(); 609 CLEAR_PENDING_EXCEPTION; 610 return JVMTI_ERROR_INTERNAL; 611 } 612 return JVMTI_ERROR_NONE; 613 } 614 615 void 616 JvmtiExport::decode_version_values(jint version, int * major, int * minor, 617 int * micro) { 618 *major = (version & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR; 619 *minor = (version & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR; 620 *micro = (version & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO; 621 } 622 623 void JvmtiExport::enter_primordial_phase() { 624 JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL); 625 } 626 627 void JvmtiExport::enter_early_start_phase() { 628 set_early_vmstart_recorded(true); 629 } 630 631 void JvmtiExport::enter_start_phase() { 632 JvmtiEnvBase::set_phase(JVMTI_PHASE_START); 633 } 634 635 void JvmtiExport::enter_onload_phase() { 636 JvmtiEnvBase::set_phase(JVMTI_PHASE_ONLOAD); 637 } 638 639 void JvmtiExport::enter_live_phase() { 640 JvmtiEnvBase::set_phase(JVMTI_PHASE_LIVE); 641 } 642 643 // 644 // JVMTI events that the VM posts to the debugger and also startup agent 645 // and call the agent's premain() for java.lang.instrument. 646 // 647 648 void JvmtiExport::post_early_vm_start() { 649 EVT_TRIG_TRACE(JVMTI_EVENT_VM_START, ("Trg Early VM start event triggered" )); 650 651 // can now enable some events 652 JvmtiEventController::vm_start(); 653 654 JvmtiEnvIterator it; 655 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 656 // Only early vmstart envs post early VMStart event 657 if (env->early_vmstart_env() && env->is_enabled(JVMTI_EVENT_VM_START)) { 658 EVT_TRACE(JVMTI_EVENT_VM_START, ("Evt Early VM start event sent" )); 659 JavaThread *thread = JavaThread::current(); 660 JvmtiThreadEventMark jem(thread); 661 JvmtiJavaThreadEventTransition jet(thread); 662 jvmtiEventVMStart callback = env->callbacks()->VMStart; 663 if (callback != nullptr) { 664 (*callback)(env->jvmti_external(), jem.jni_env()); 665 } 666 } 667 } 668 } 669 670 void JvmtiExport::post_vm_start() { 671 EVT_TRIG_TRACE(JVMTI_EVENT_VM_START, ("Trg VM start event triggered" )); 672 673 // can now enable some events 674 JvmtiEventController::vm_start(); 675 676 JvmtiEnvIterator it; 677 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 678 // Early vmstart envs do not post normal VMStart event 679 if (!env->early_vmstart_env() && env->is_enabled(JVMTI_EVENT_VM_START)) { 680 EVT_TRACE(JVMTI_EVENT_VM_START, ("Evt VM start event sent" )); 681 682 JavaThread *thread = JavaThread::current(); 683 JvmtiThreadEventMark jem(thread); 684 JvmtiJavaThreadEventTransition jet(thread); 685 jvmtiEventVMStart callback = env->callbacks()->VMStart; 686 if (callback != nullptr) { 687 (*callback)(env->jvmti_external(), jem.jni_env()); 688 } 689 } 690 } 691 } 692 693 static OopStorage* _jvmti_oop_storage = nullptr; 694 static OopStorage* _weak_tag_storage = nullptr; 695 696 OopStorage* JvmtiExport::jvmti_oop_storage() { 697 assert(_jvmti_oop_storage != nullptr, "not yet initialized"); 698 return _jvmti_oop_storage; 699 } 700 701 OopStorage* JvmtiExport::weak_tag_storage() { 702 assert(_weak_tag_storage != nullptr, "not yet initialized"); 703 return _weak_tag_storage; 704 } 705 706 void JvmtiExport::initialize_oop_storage() { 707 // OopStorage needs to be created early in startup and unconditionally 708 // because of OopStorageSet static array indices. 709 _jvmti_oop_storage = OopStorageSet::create_strong("JVMTI OopStorage", mtServiceability); 710 _weak_tag_storage = OopStorageSet::create_weak("JVMTI Tag Weak OopStorage", mtServiceability); 711 _weak_tag_storage->register_num_dead_callback(&JvmtiTagMap::gc_notification); 712 } 713 714 // Lookup an agent from an JvmtiEnv. Return agent only if it is not yet initialized. 715 // An agent can create multiple JvmtiEnvs, but for agent initialization, we are only interested in the initial one. 716 static JvmtiAgent* lookup_uninitialized_agent(JvmtiEnv* env, void* callback) { 717 JvmtiAgent* const agent = JvmtiAgentList::lookup(env, callback); 718 return agent == nullptr || agent->is_initialized() ? nullptr : agent; 719 } 720 721 void JvmtiExport::post_vm_initialized() { 722 EVT_TRIG_TRACE(JVMTI_EVENT_VM_INIT, ("Trg VM init event triggered" )); 723 724 // can now enable events 725 JvmtiEventController::vm_init(); 726 727 JvmtiEnvIterator it; 728 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 729 if (env->is_enabled(JVMTI_EVENT_VM_INIT)) { 730 EVT_TRACE(JVMTI_EVENT_VM_INIT, ("Evt VM init event sent" )); 731 732 JavaThread *thread = JavaThread::current(); 733 JvmtiThreadEventMark jem(thread); 734 JvmtiJavaThreadEventTransition jet(thread); 735 jvmtiEventVMInit callback = env->callbacks()->VMInit; 736 if (callback != nullptr) { 737 // We map the JvmtiEnv to its Agent to measure when and for how long 738 // it took to initialize so that JFR can report this information. 739 JvmtiAgent* const agent = lookup_uninitialized_agent(env, reinterpret_cast<void*>(callback)); 740 if (agent != nullptr) { 741 agent->initialization_begin(); 742 } 743 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); 744 if (agent != nullptr) { 745 agent->initialization_end(); 746 } 747 } 748 } 749 } 750 751 // Agents are initialized as part of posting the VMInit event above. 752 // For -Xrun agents and agents with no VMInit callback, we explicitly ensure they are also initialized. 753 // JVM_OnLoad and Agent_OnLoad callouts are performed too early for the proper timestamp logic. 754 JvmtiAgentList::initialize(); 755 } 756 757 void JvmtiExport::post_vm_death() { 758 EVT_TRIG_TRACE(JVMTI_EVENT_VM_DEATH, ("Trg VM death event triggered" )); 759 760 JvmtiTagMap::flush_all_object_free_events(); 761 762 JvmtiEnvIterator it; 763 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 764 if (env->is_enabled(JVMTI_EVENT_VM_DEATH)) { 765 EVT_TRACE(JVMTI_EVENT_VM_DEATH, ("Evt VM death event sent" )); 766 767 JavaThread *thread = JavaThread::current(); 768 JvmtiEventMark jem(thread); 769 JvmtiJavaThreadEventTransition jet(thread); 770 jvmtiEventVMDeath callback = env->callbacks()->VMDeath; 771 if (callback != nullptr) { 772 (*callback)(env->jvmti_external(), jem.jni_env()); 773 } 774 } 775 } 776 777 JvmtiEnvBase::set_phase(JVMTI_PHASE_DEAD); 778 JvmtiEventController::vm_death(); 779 } 780 781 char** 782 JvmtiExport::get_all_native_method_prefixes(int* count_ptr) { 783 // Have to grab JVMTI thread state lock to be sure environment doesn't 784 // go away while we iterate them. No locks during VM bring-up. 785 if (Threads::number_of_threads() == 0 || SafepointSynchronize::is_at_safepoint()) { 786 return JvmtiEnvBase::get_all_native_method_prefixes(count_ptr); 787 } else { 788 MutexLocker mu(JvmtiThreadState_lock); 789 return JvmtiEnvBase::get_all_native_method_prefixes(count_ptr); 790 } 791 } 792 793 // Convert an external thread reference to a JavaThread found on the 794 // specified ThreadsList. The ThreadsListHandle in the caller "protects" 795 // the returned JavaThread *. 796 // 797 // If thread_oop_p is not null, then the caller wants to use the oop 798 // after this call so the oop is returned. On success, *jt_pp is set 799 // to the converted JavaThread * and JVMTI_ERROR_NONE is returned. 800 // On error, returns various JVMTI_ERROR_* values. 801 // 802 jvmtiError 803 JvmtiExport::cv_external_thread_to_JavaThread(ThreadsList * t_list, 804 jthread thread, 805 JavaThread ** jt_pp, 806 oop * thread_oop_p) { 807 assert(t_list != nullptr, "must have a ThreadsList"); 808 assert(jt_pp != nullptr, "must have a return JavaThread pointer"); 809 // thread_oop_p is optional so no assert() 810 811 if (thread_oop_p != nullptr) { 812 *thread_oop_p = nullptr; 813 } 814 815 oop thread_oop = JNIHandles::resolve_external_guard(thread); 816 if (thread_oop == nullptr) { 817 // null jthread, GC'ed jthread or a bad JNI handle. 818 return JVMTI_ERROR_INVALID_THREAD; 819 } 820 // Looks like an oop at this point. 821 822 if (!thread_oop->is_a(vmClasses::Thread_klass())) { 823 // The oop is not a java.lang.Thread. 824 return JVMTI_ERROR_INVALID_THREAD; 825 } 826 // Looks like a java.lang.Thread oop at this point. 827 828 if (thread_oop_p != nullptr) { 829 // Return the oop to the caller; the caller may still want 830 // the oop even if this function returns an error. 831 *thread_oop_p = thread_oop; 832 } 833 834 JavaThread * java_thread = java_lang_Thread::thread(thread_oop); 835 if (java_thread == nullptr) { 836 if (java_lang_VirtualThread::is_instance(thread_oop)) { 837 return JVMTI_ERROR_INVALID_THREAD; 838 } 839 // The java.lang.Thread does not contain a JavaThread * so it has 840 // not yet run or it has died. 841 return JVMTI_ERROR_THREAD_NOT_ALIVE; 842 } 843 // Looks like a live JavaThread at this point. 844 845 if (!t_list->includes(java_thread)) { 846 // Not on the JavaThreads list so it is not alive. 847 return JVMTI_ERROR_THREAD_NOT_ALIVE; 848 } 849 850 // Return a live JavaThread that is "protected" by the 851 // ThreadsListHandle in the caller. 852 *jt_pp = java_thread; 853 854 return JVMTI_ERROR_NONE; 855 } 856 857 // Convert an oop to a JavaThread found on the specified ThreadsList. 858 // The ThreadsListHandle in the caller "protects" the returned 859 // JavaThread *. 860 // 861 // On success, *jt_pp is set to the converted JavaThread * and 862 // JVMTI_ERROR_NONE is returned. On error, returns various 863 // JVMTI_ERROR_* values. 864 // 865 jvmtiError 866 JvmtiExport::cv_oop_to_JavaThread(ThreadsList * t_list, oop thread_oop, 867 JavaThread ** jt_pp) { 868 assert(t_list != nullptr, "must have a ThreadsList"); 869 assert(thread_oop != nullptr, "must have an oop"); 870 assert(jt_pp != nullptr, "must have a return JavaThread pointer"); 871 872 if (!thread_oop->is_a(vmClasses::Thread_klass())) { 873 // The oop is not a java.lang.Thread. 874 return JVMTI_ERROR_INVALID_THREAD; 875 } 876 // Looks like a java.lang.Thread oop at this point. 877 878 JavaThread * java_thread = java_lang_Thread::thread(thread_oop); 879 if (java_thread == nullptr) { 880 // The java.lang.Thread does not contain a JavaThread * so it has 881 // not yet run or it has died. 882 return JVMTI_ERROR_THREAD_NOT_ALIVE; 883 } 884 // Looks like a live JavaThread at this point. 885 886 if (!t_list->includes(java_thread)) { 887 // Not on the JavaThreads list so it is not alive. 888 return JVMTI_ERROR_THREAD_NOT_ALIVE; 889 } 890 891 // Return a live JavaThread that is "protected" by the 892 // ThreadsListHandle in the caller. 893 *jt_pp = java_thread; 894 895 return JVMTI_ERROR_NONE; 896 } 897 898 class JvmtiClassFileLoadHookPoster : public StackObj { 899 private: 900 Symbol* _h_name; 901 Handle _class_loader; 902 Handle _h_protection_domain; 903 unsigned char ** _data_ptr; 904 unsigned char ** _end_ptr; 905 JavaThread * _thread; 906 jint _curr_len; 907 unsigned char * _curr_data; 908 JvmtiEnv * _curr_env; 909 JvmtiCachedClassFileData ** _cached_class_file_ptr; 910 JvmtiThreadState * _state; 911 Klass* _class_being_redefined; 912 JvmtiClassLoadKind _load_kind; 913 bool _has_been_modified; 914 915 public: 916 inline JvmtiClassFileLoadHookPoster(Symbol* h_name, Handle class_loader, 917 Handle h_protection_domain, 918 unsigned char **data_ptr, unsigned char **end_ptr, 919 JvmtiCachedClassFileData **cache_ptr) { 920 _h_name = h_name; 921 _class_loader = class_loader; 922 _h_protection_domain = h_protection_domain; 923 _data_ptr = data_ptr; 924 _end_ptr = end_ptr; 925 _thread = JavaThread::current(); 926 _curr_len = pointer_delta_as_int(*end_ptr, *data_ptr); 927 _curr_data = *data_ptr; 928 _curr_env = nullptr; 929 _cached_class_file_ptr = cache_ptr; 930 _has_been_modified = false; 931 932 assert(!_thread->is_in_any_VTMS_transition(), "CFLH events are not allowed in any VTMS transition"); 933 934 _state = JvmtiExport::get_jvmti_thread_state(_thread); 935 if (_state != nullptr) { 936 _class_being_redefined = _state->get_class_being_redefined(); 937 _load_kind = _state->get_class_load_kind(); 938 Klass* klass = (_class_being_redefined == nullptr) ? nullptr : _class_being_redefined; 939 if (_load_kind != jvmti_class_load_kind_load && klass != nullptr) { 940 ModuleEntry* module_entry = InstanceKlass::cast(klass)->module(); 941 assert(module_entry != nullptr, "module_entry should always be set"); 942 if (module_entry->is_named() && 943 module_entry->module() != nullptr && 944 !module_entry->has_default_read_edges()) { 945 if (!module_entry->set_has_default_read_edges()) { 946 // We won a potential race. 947 // Add read edges to the unnamed modules of the bootstrap and app class loaders 948 Handle class_module(_thread, module_entry->module()); // Obtain j.l.r.Module 949 JvmtiExport::add_default_read_edges(class_module, _thread); 950 } 951 } 952 } 953 // Clear class_being_redefined flag here. The action 954 // from agent handler could generate a new class file load 955 // hook event and if it is not cleared the new event generated 956 // from regular class file load could have this stale redefined 957 // class handle info. 958 _state->clear_class_being_redefined(); 959 } else { 960 // redefine and retransform will always set the thread state 961 _class_being_redefined = nullptr; 962 _load_kind = jvmti_class_load_kind_load; 963 } 964 } 965 966 void post() { 967 post_all_envs(); 968 copy_modified_data(); 969 } 970 971 bool has_been_modified() { return _has_been_modified; } 972 973 private: 974 void post_all_envs() { 975 if (_load_kind != jvmti_class_load_kind_retransform) { 976 // for class load and redefine, 977 // call the non-retransformable agents 978 JvmtiEnvIterator it; 979 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 980 if (!env->is_retransformable() && env->is_enabled(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK)) { 981 // non-retransformable agents cannot retransform back, 982 // so no need to cache the original class file bytes 983 post_to_env(env, false); 984 } 985 } 986 } 987 JvmtiEnvIterator it; 988 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 989 // retransformable agents get all events 990 if (env->is_retransformable() && env->is_enabled(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK)) { 991 // retransformable agents need to cache the original class file 992 // bytes if changes are made via the ClassFileLoadHook 993 post_to_env(env, true); 994 } 995 } 996 } 997 998 void post_to_env(JvmtiEnv* env, bool caching_needed) { 999 if (env->phase() == JVMTI_PHASE_PRIMORDIAL && !env->early_class_hook_env()) { 1000 return; 1001 } 1002 unsigned char *new_data = nullptr; 1003 jint new_len = 0; 1004 JvmtiClassFileLoadEventMark jem(_thread, _h_name, _class_loader, 1005 _h_protection_domain, 1006 _class_being_redefined); 1007 JvmtiJavaThreadEventTransition jet(_thread); 1008 jvmtiEventClassFileLoadHook callback = env->callbacks()->ClassFileLoadHook; 1009 if (callback != nullptr) { 1010 (*callback)(env->jvmti_external(), jem.jni_env(), 1011 jem.class_being_redefined(), 1012 jem.jloader(), jem.class_name(), 1013 jem.protection_domain(), 1014 _curr_len, _curr_data, 1015 &new_len, &new_data); 1016 } 1017 if (new_data != nullptr) { 1018 // this agent has modified class data. 1019 _has_been_modified = true; 1020 if (caching_needed && *_cached_class_file_ptr == nullptr) { 1021 // data has been changed by the new retransformable agent 1022 // and it hasn't already been cached, cache it 1023 JvmtiCachedClassFileData *p; 1024 p = (JvmtiCachedClassFileData *)os::malloc( 1025 offset_of(JvmtiCachedClassFileData, data) + _curr_len, mtInternal); 1026 if (p == nullptr) { 1027 vm_exit_out_of_memory(offset_of(JvmtiCachedClassFileData, data) + _curr_len, 1028 OOM_MALLOC_ERROR, 1029 "unable to allocate cached copy of original class bytes"); 1030 } 1031 p->length = _curr_len; 1032 memcpy(p->data, _curr_data, _curr_len); 1033 *_cached_class_file_ptr = p; 1034 } 1035 1036 if (_curr_data != *_data_ptr) { 1037 // curr_data is previous agent modified class data. 1038 // And this has been changed by the new agent so 1039 // we can delete it now. 1040 _curr_env->Deallocate(_curr_data); 1041 } 1042 1043 // Class file data has changed by the current agent. 1044 _curr_data = new_data; 1045 _curr_len = new_len; 1046 // Save the current agent env we need this to deallocate the 1047 // memory allocated by this agent. 1048 _curr_env = env; 1049 } 1050 } 1051 1052 void copy_modified_data() { 1053 // if one of the agent has modified class file data. 1054 // Copy modified class data to new resources array. 1055 if (_curr_data != *_data_ptr) { 1056 *_data_ptr = NEW_RESOURCE_ARRAY(u1, _curr_len); 1057 memcpy(*_data_ptr, _curr_data, _curr_len); 1058 *_end_ptr = *_data_ptr + _curr_len; 1059 _curr_env->Deallocate(_curr_data); 1060 } 1061 } 1062 }; 1063 1064 bool JvmtiExport::is_early_phase() { 1065 return JvmtiEnvBase::get_phase() <= JVMTI_PHASE_PRIMORDIAL; 1066 } 1067 1068 bool JvmtiExport::has_early_class_hook_env() { 1069 JvmtiEnvIterator it; 1070 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 1071 if (env->early_class_hook_env()) { 1072 return true; 1073 } 1074 } 1075 return false; 1076 } 1077 1078 bool JvmtiExport::_should_post_class_file_load_hook = false; 1079 1080 // This flag is read by C2 during VM internal objects allocation 1081 int JvmtiExport::_should_notify_object_alloc = 0; 1082 1083 // this entry is for class file load hook on class load, redefine and retransform 1084 bool JvmtiExport::post_class_file_load_hook(Symbol* h_name, 1085 Handle class_loader, 1086 Handle h_protection_domain, 1087 unsigned char **data_ptr, 1088 unsigned char **end_ptr, 1089 JvmtiCachedClassFileData **cache_ptr) { 1090 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1091 return false; 1092 } 1093 1094 if (JavaThread::current()->is_in_any_VTMS_transition()) { 1095 return false; // no events should be posted if thread is in any VTMS transition 1096 } 1097 1098 JvmtiClassFileLoadHookPoster poster(h_name, class_loader, 1099 h_protection_domain, 1100 data_ptr, end_ptr, 1101 cache_ptr); 1102 poster.post(); 1103 return poster.has_been_modified(); 1104 } 1105 1106 void JvmtiExport::report_unsupported(bool on) { 1107 // If any JVMTI service is turned on, we need to exit before native code 1108 // tries to access nonexistent services. 1109 if (on) { 1110 vm_exit_during_initialization("Java Kernel does not support JVMTI."); 1111 } 1112 } 1113 1114 1115 static inline Klass* oop_to_klass(oop obj) { 1116 Klass* k = obj->klass(); 1117 1118 // if the object is a java.lang.Class then return the java mirror 1119 if (k == vmClasses::Class_klass()) { 1120 if (!java_lang_Class::is_primitive(obj)) { 1121 k = java_lang_Class::as_Klass(obj); 1122 assert(k != nullptr, "class for non-primitive mirror must exist"); 1123 } 1124 } 1125 return k; 1126 } 1127 1128 class JvmtiObjectAllocEventMark : public JvmtiClassEventMark { 1129 private: 1130 jobject _jobj; 1131 jlong _size; 1132 public: 1133 JvmtiObjectAllocEventMark(JavaThread *thread, oop obj) : JvmtiClassEventMark(thread, oop_to_klass(obj)) { 1134 _jobj = (jobject)to_jobject(obj); 1135 _size = obj->size() * wordSize; 1136 }; 1137 jobject jni_jobject() { return _jobj; } 1138 jlong size() { return _size; } 1139 }; 1140 1141 class JvmtiCompiledMethodLoadEventMark : public JvmtiMethodEventMark { 1142 private: 1143 jint _code_size; 1144 const void *_code_data; 1145 jint _map_length; 1146 jvmtiAddrLocationMap *_map; 1147 const void *_compile_info; 1148 public: 1149 JvmtiCompiledMethodLoadEventMark(JavaThread *thread, nmethod *nm, void* compile_info_ptr = nullptr) 1150 : JvmtiMethodEventMark(thread,methodHandle(thread, nm->method())) { 1151 _code_data = nm->code_begin(); 1152 _code_size = nm->code_size(); 1153 _compile_info = compile_info_ptr; // Set void pointer of compiledMethodLoad Event. Default value is null. 1154 JvmtiCodeBlobEvents::build_jvmti_addr_location_map(nm, &_map, &_map_length); 1155 } 1156 ~JvmtiCompiledMethodLoadEventMark() { 1157 FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map); 1158 } 1159 1160 jint code_size() { return _code_size; } 1161 const void *code_data() { return _code_data; } 1162 jint map_length() { return _map_length; } 1163 const jvmtiAddrLocationMap* map() { return _map; } 1164 const void *compile_info() { return _compile_info; } 1165 }; 1166 1167 1168 1169 class JvmtiMonitorEventMark : public JvmtiVirtualThreadEventMark { 1170 private: 1171 jobject _jobj; 1172 public: 1173 JvmtiMonitorEventMark(JavaThread *thread, oop object) 1174 : JvmtiVirtualThreadEventMark(thread){ 1175 _jobj = to_jobject(object); 1176 } 1177 jobject jni_object() { return _jobj; } 1178 }; 1179 1180 /////////////////////////////////////////////////////////////// 1181 // 1182 // pending CompiledMethodUnload support 1183 // 1184 1185 void JvmtiExport::post_compiled_method_unload( 1186 jmethodID method, const void *code_begin) { 1187 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1188 return; 1189 } 1190 JavaThread* thread = JavaThread::current(); 1191 EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD, 1192 ("[%s] method compile unload event triggered", 1193 JvmtiTrace::safe_get_thread_name(thread))); 1194 1195 // post the event for each environment that has this event enabled. 1196 JvmtiEnvIterator it; 1197 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 1198 if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_UNLOAD)) { 1199 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1200 continue; 1201 } 1202 EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD, 1203 ("[%s] class compile method unload event sent jmethodID " PTR_FORMAT, 1204 JvmtiTrace::safe_get_thread_name(thread), p2i(method))); 1205 1206 ResourceMark rm(thread); 1207 1208 JvmtiEventMark jem(thread); 1209 JvmtiJavaThreadEventTransition jet(thread); 1210 jvmtiEventCompiledMethodUnload callback = env->callbacks()->CompiledMethodUnload; 1211 if (callback != nullptr) { 1212 (*callback)(env->jvmti_external(), method, code_begin); 1213 } 1214 } 1215 } 1216 } 1217 1218 /////////////////////////////////////////////////////////////// 1219 // 1220 // JvmtiExport 1221 // 1222 1223 void JvmtiExport::post_raw_breakpoint(JavaThread *thread, Method* method, address location) { 1224 HandleMark hm(thread); 1225 methodHandle mh(thread, method); 1226 1227 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1228 if (state == nullptr) { 1229 return; 1230 } 1231 if (thread->is_in_any_VTMS_transition()) { 1232 return; // no events should be posted if thread is in any VTMS transition 1233 } 1234 1235 EVT_TRIG_TRACE(JVMTI_EVENT_BREAKPOINT, ("[%s] Trg Breakpoint triggered", 1236 JvmtiTrace::safe_get_thread_name(thread))); 1237 JvmtiEnvThreadStateIterator it(state); 1238 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1239 ets->compare_and_set_current_location(mh(), location, JVMTI_EVENT_BREAKPOINT); 1240 if (!ets->breakpoint_posted() && ets->is_enabled(JVMTI_EVENT_BREAKPOINT)) { 1241 ThreadState old_os_state = thread->osthread()->get_state(); 1242 thread->osthread()->set_state(BREAKPOINTED); 1243 EVT_TRACE(JVMTI_EVENT_BREAKPOINT, ("[%s] Evt Breakpoint sent %s.%s @ " INTX_FORMAT, 1244 JvmtiTrace::safe_get_thread_name(thread), 1245 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1246 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 1247 location - mh()->code_base() )); 1248 1249 JvmtiEnv *env = ets->get_env(); 1250 JvmtiLocationEventMark jem(thread, mh, location); 1251 JvmtiJavaThreadEventTransition jet(thread); 1252 jvmtiEventBreakpoint callback = env->callbacks()->Breakpoint; 1253 if (callback != nullptr) { 1254 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 1255 jem.jni_methodID(), jem.location()); 1256 } 1257 1258 ets->set_breakpoint_posted(); 1259 thread->osthread()->set_state(old_os_state); 1260 } 1261 } 1262 } 1263 1264 ////////////////////////////////////////////////////////////////////////////// 1265 1266 bool JvmtiExport::_can_get_source_debug_extension = false; 1267 bool JvmtiExport::_can_maintain_original_method_order = false; 1268 bool JvmtiExport::_can_post_interpreter_events = false; 1269 bool JvmtiExport::_can_post_on_exceptions = false; 1270 bool JvmtiExport::_can_post_breakpoint = false; 1271 bool JvmtiExport::_can_post_field_access = false; 1272 bool JvmtiExport::_can_post_field_modification = false; 1273 bool JvmtiExport::_can_post_method_entry = false; 1274 bool JvmtiExport::_can_post_method_exit = false; 1275 bool JvmtiExport::_can_post_frame_pop = false; 1276 bool JvmtiExport::_can_pop_frame = false; 1277 bool JvmtiExport::_can_force_early_return = false; 1278 bool JvmtiExport::_can_support_virtual_threads = false; 1279 bool JvmtiExport::_can_get_owned_monitor_info = false; 1280 1281 bool JvmtiExport::_early_vmstart_recorded = false; 1282 1283 bool JvmtiExport::_should_post_single_step = false; 1284 bool JvmtiExport::_should_post_field_access = false; 1285 bool JvmtiExport::_should_post_field_modification = false; 1286 bool JvmtiExport::_should_post_class_load = false; 1287 bool JvmtiExport::_should_post_class_prepare = false; 1288 bool JvmtiExport::_should_post_class_unload = false; 1289 bool JvmtiExport::_should_post_thread_life = false; 1290 bool JvmtiExport::_should_clean_up_heap_objects = false; 1291 bool JvmtiExport::_should_post_native_method_bind = false; 1292 bool JvmtiExport::_should_post_dynamic_code_generated = false; 1293 bool JvmtiExport::_should_post_data_dump = false; 1294 bool JvmtiExport::_should_post_compiled_method_load = false; 1295 bool JvmtiExport::_should_post_compiled_method_unload = false; 1296 bool JvmtiExport::_should_post_monitor_contended_enter = false; 1297 bool JvmtiExport::_should_post_monitor_contended_entered = false; 1298 bool JvmtiExport::_should_post_monitor_wait = false; 1299 bool JvmtiExport::_should_post_monitor_waited = false; 1300 bool JvmtiExport::_should_post_garbage_collection_start = false; 1301 bool JvmtiExport::_should_post_garbage_collection_finish = false; 1302 bool JvmtiExport::_should_post_object_free = false; 1303 bool JvmtiExport::_should_post_resource_exhausted = false; 1304 bool JvmtiExport::_should_post_vm_object_alloc = false; 1305 bool JvmtiExport::_should_post_sampled_object_alloc = false; 1306 bool JvmtiExport::_should_post_on_exceptions = false; 1307 bool JvmtiExport::_should_post_vthread_start = false; 1308 bool JvmtiExport::_should_post_vthread_end = false; 1309 bool JvmtiExport::_should_post_vthread_mount = false; 1310 bool JvmtiExport::_should_post_vthread_unmount = false; 1311 1312 //////////////////////////////////////////////////////////////////////////////////////////////// 1313 1314 1315 // 1316 // JVMTI single step management 1317 // 1318 void JvmtiExport::at_single_stepping_point(JavaThread *thread, Method* method, address location) { 1319 assert(JvmtiExport::should_post_single_step(), "must be single stepping"); 1320 1321 HandleMark hm(thread); 1322 methodHandle mh(thread, method); 1323 1324 // update information about current location and post a step event 1325 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1326 if (state == nullptr) { 1327 return; 1328 } 1329 EVT_TRIG_TRACE(JVMTI_EVENT_SINGLE_STEP, ("[%s] Trg Single Step triggered", 1330 JvmtiTrace::safe_get_thread_name(thread))); 1331 if (!state->hide_single_stepping()) { 1332 if (state->is_pending_step_for_popframe()) { 1333 state->process_pending_step_for_popframe(); 1334 } 1335 if (state->is_pending_step_for_earlyret()) { 1336 state->process_pending_step_for_earlyret(); 1337 } 1338 JvmtiExport::post_single_step(thread, mh(), location); 1339 } 1340 } 1341 1342 1343 void JvmtiExport::expose_single_stepping(JavaThread *thread) { 1344 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1345 if (state != nullptr) { 1346 state->clear_hide_single_stepping(); 1347 } 1348 } 1349 1350 1351 bool JvmtiExport::hide_single_stepping(JavaThread *thread) { 1352 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1353 if (state != nullptr && state->is_enabled(JVMTI_EVENT_SINGLE_STEP)) { 1354 state->set_hide_single_stepping(); 1355 return true; 1356 } else { 1357 return false; 1358 } 1359 } 1360 1361 void JvmtiExport::post_class_load(JavaThread *thread, Klass* klass) { 1362 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1363 return; 1364 } 1365 HandleMark hm(thread); 1366 1367 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1368 if (state == nullptr) { 1369 return; 1370 } 1371 if (thread->is_in_any_VTMS_transition()) { 1372 return; // no events should be posted if thread is in any VTMS transition 1373 } 1374 1375 EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_LOAD, ("[%s] Trg Class Load triggered", 1376 JvmtiTrace::safe_get_thread_name(thread))); 1377 JvmtiEnvThreadStateIterator it(state); 1378 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1379 if (ets->is_enabled(JVMTI_EVENT_CLASS_LOAD)) { 1380 JvmtiEnv *env = ets->get_env(); 1381 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1382 continue; 1383 } 1384 EVT_TRACE(JVMTI_EVENT_CLASS_LOAD, ("[%s] Evt Class Load sent %s", 1385 JvmtiTrace::safe_get_thread_name(thread), 1386 klass==nullptr? "null" : klass->external_name() )); 1387 JvmtiClassEventMark jem(thread, klass); 1388 JvmtiJavaThreadEventTransition jet(thread); 1389 jvmtiEventClassLoad callback = env->callbacks()->ClassLoad; 1390 if (callback != nullptr) { 1391 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_class()); 1392 } 1393 } 1394 } 1395 } 1396 1397 1398 void JvmtiExport::post_class_prepare(JavaThread *thread, Klass* klass) { 1399 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1400 return; 1401 } 1402 HandleMark hm(thread); 1403 1404 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1405 if (state == nullptr) { 1406 return; 1407 } 1408 if (thread->is_in_any_VTMS_transition()) { 1409 return; // no events should be posted if thread is in any VTMS transition 1410 } 1411 1412 EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("[%s] Trg Class Prepare triggered", 1413 JvmtiTrace::safe_get_thread_name(thread))); 1414 JvmtiEnvThreadStateIterator it(state); 1415 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1416 if (ets->is_enabled(JVMTI_EVENT_CLASS_PREPARE)) { 1417 JvmtiEnv *env = ets->get_env(); 1418 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1419 continue; 1420 } 1421 EVT_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("[%s] Evt Class Prepare sent %s", 1422 JvmtiTrace::safe_get_thread_name(thread), 1423 klass==nullptr? "null" : klass->external_name() )); 1424 JvmtiClassEventMark jem(thread, klass); 1425 JvmtiJavaThreadEventTransition jet(thread); 1426 jvmtiEventClassPrepare callback = env->callbacks()->ClassPrepare; 1427 if (callback != nullptr) { 1428 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_class()); 1429 } 1430 } 1431 } 1432 } 1433 1434 void JvmtiExport::post_class_unload(Klass* klass) { 1435 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1436 return; 1437 } 1438 1439 // postings to the service thread so that it can perform them in a safe 1440 // context and in-order. 1441 ResourceMark rm; 1442 // JvmtiDeferredEvent copies the string. 1443 JvmtiDeferredEvent event = JvmtiDeferredEvent::class_unload_event(klass->name()->as_C_string()); 1444 ServiceThread::enqueue_deferred_event(&event); 1445 } 1446 1447 1448 void JvmtiExport::post_class_unload_internal(const char* name) { 1449 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1450 return; 1451 } 1452 assert(Thread::current()->is_service_thread(), "must be called from ServiceThread"); 1453 JavaThread *thread = JavaThread::current(); 1454 HandleMark hm(thread); 1455 1456 EVT_TRIG_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Trg Class Unload triggered" )); 1457 if (JvmtiEventController::is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) { 1458 1459 JvmtiEnvIterator it; 1460 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 1461 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1462 continue; 1463 } 1464 if (env->is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) { 1465 EVT_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Evt Class Unload sent %s", name)); 1466 1467 JvmtiEventMark jem(thread); 1468 JvmtiJavaThreadEventTransition jet(thread); 1469 jvmtiExtensionEvent callback = env->ext_callbacks()->ClassUnload; 1470 if (callback != nullptr) { 1471 (*callback)(env->jvmti_external(), jem.jni_env(), name); 1472 } 1473 } 1474 } 1475 } 1476 } 1477 1478 1479 void JvmtiExport::post_thread_start(JavaThread *thread) { 1480 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1481 return; 1482 } 1483 assert(thread->thread_state() == _thread_in_vm, "must be in vm state"); 1484 1485 EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_START, ("[%s] Trg Thread Start event triggered", 1486 JvmtiTrace::safe_get_thread_name(thread))); 1487 1488 // do JVMTI thread initialization (if needed) 1489 JvmtiEventController::thread_started(thread); 1490 1491 if (thread->threadObj()->is_a(vmClasses::BoundVirtualThread_klass())) { 1492 if (JvmtiExport::can_support_virtual_threads()) { 1493 // Check for VirtualThreadStart event instead. 1494 HandleMark hm(thread); 1495 Handle vthread(thread, thread->threadObj()); 1496 JvmtiExport::post_vthread_start((jthread)vthread.raw_value()); 1497 } 1498 return; 1499 } 1500 1501 // Do not post thread start event for hidden java thread. 1502 if (JvmtiEventController::is_enabled(JVMTI_EVENT_THREAD_START) && 1503 !thread->is_hidden_from_external_view()) { 1504 JvmtiEnvIterator it; 1505 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 1506 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1507 continue; 1508 } 1509 if (env->is_enabled(JVMTI_EVENT_THREAD_START)) { 1510 EVT_TRACE(JVMTI_EVENT_THREAD_START, ("[%s] Evt Thread Start event sent", 1511 JvmtiTrace::safe_get_thread_name(thread) )); 1512 1513 JvmtiVirtualThreadEventMark jem(thread); 1514 JvmtiJavaThreadEventTransition jet(thread); 1515 jvmtiEventThreadStart callback = env->callbacks()->ThreadStart; 1516 if (callback != nullptr) { 1517 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); 1518 } 1519 } 1520 } 1521 } 1522 } 1523 1524 1525 void JvmtiExport::post_thread_end(JavaThread *thread) { 1526 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1527 return; 1528 } 1529 EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_END, ("[%s] Trg Thread End event triggered", 1530 JvmtiTrace::safe_get_thread_name(thread))); 1531 1532 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1533 if (state == nullptr) { 1534 return; 1535 } 1536 1537 if (thread->threadObj()->is_a(vmClasses::BoundVirtualThread_klass())) { 1538 if (JvmtiExport::can_support_virtual_threads()) { 1539 // Check for VirtualThreadEnd event instead. 1540 HandleMark hm(thread); 1541 Handle vthread(thread, thread->threadObj()); 1542 JvmtiExport::post_vthread_end((jthread)vthread.raw_value()); 1543 } 1544 return; 1545 } 1546 1547 // Do not post thread end event for hidden java thread. 1548 if (state->is_enabled(JVMTI_EVENT_THREAD_END) && 1549 !thread->is_hidden_from_external_view()) { 1550 1551 JvmtiEnvThreadStateIterator it(state); 1552 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1553 JvmtiEnv *env = ets->get_env(); 1554 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1555 continue; 1556 } 1557 if (ets->is_enabled(JVMTI_EVENT_THREAD_END)) { 1558 EVT_TRACE(JVMTI_EVENT_THREAD_END, ("[%s] Evt Thread End event sent", 1559 JvmtiTrace::safe_get_thread_name(thread) )); 1560 1561 JvmtiVirtualThreadEventMark jem(thread); 1562 JvmtiJavaThreadEventTransition jet(thread); 1563 jvmtiEventThreadEnd callback = env->callbacks()->ThreadEnd; 1564 if (callback != nullptr) { 1565 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); 1566 } 1567 } 1568 } 1569 } 1570 } 1571 1572 1573 void JvmtiExport::post_vthread_start(jobject vthread) { 1574 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1575 return; 1576 } 1577 EVT_TRIG_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_START, ("[%p] Trg Virtual Thread Start event triggered", vthread)); 1578 1579 JavaThread *thread = JavaThread::current(); 1580 assert(!thread->is_hidden_from_external_view(), "carrier threads can't be hidden"); 1581 1582 if (JvmtiEventController::is_enabled(JVMTI_EVENT_VIRTUAL_THREAD_START)) { 1583 JvmtiEnvIterator it; 1584 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 1585 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1586 continue; 1587 } 1588 if (env->is_enabled(JVMTI_EVENT_VIRTUAL_THREAD_START)) { 1589 EVT_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_START, ("[%p] Evt Virtual Thread Start event sent", vthread)); 1590 1591 JvmtiVirtualThreadEventMark jem(thread); 1592 JvmtiJavaThreadEventTransition jet(thread); 1593 jvmtiEventVirtualThreadStart callback = env->callbacks()->VirtualThreadStart; 1594 if (callback != nullptr) { 1595 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); 1596 } 1597 } 1598 } 1599 } 1600 } 1601 1602 void JvmtiExport::post_vthread_end(jobject vthread) { 1603 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1604 return; 1605 } 1606 EVT_TRIG_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_END, ("[%p] Trg Virtual Thread End event triggered", vthread)); 1607 1608 JavaThread *thread = JavaThread::current(); 1609 assert(!thread->is_hidden_from_external_view(), "carrier threads can't be hidden"); 1610 1611 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1612 if (state == nullptr) { 1613 return; 1614 } 1615 1616 if (state->is_enabled(JVMTI_EVENT_VIRTUAL_THREAD_END)) { 1617 JvmtiEnvThreadStateIterator it(state); 1618 1619 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1620 JvmtiEnv *env = ets->get_env(); 1621 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1622 continue; 1623 } 1624 if (ets->is_enabled(JVMTI_EVENT_VIRTUAL_THREAD_END)) { 1625 EVT_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_END, ("[%p] Evt Virtual Thread End event sent", vthread)); 1626 1627 JvmtiVirtualThreadEventMark jem(thread); 1628 JvmtiJavaThreadEventTransition jet(thread); 1629 jvmtiEventVirtualThreadEnd callback = env->callbacks()->VirtualThreadEnd; 1630 if (callback != nullptr) { 1631 (*callback)(env->jvmti_external(), jem.jni_env(), vthread); 1632 } 1633 } 1634 } 1635 } 1636 } 1637 1638 void JvmtiExport::post_vthread_mount(jobject vthread) { 1639 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1640 return; 1641 } 1642 JavaThread *thread = JavaThread::current(); 1643 HandleMark hm(thread); 1644 EVT_TRIG_TRACE(EXT_EVENT_VIRTUAL_THREAD_MOUNT, ("[%p] Trg Virtual Thread Mount event triggered", vthread)); 1645 1646 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1647 if (state == nullptr) { 1648 return; 1649 } 1650 1651 if (state->is_enabled((jvmtiEvent)EXT_EVENT_VIRTUAL_THREAD_MOUNT)) { 1652 JvmtiEnvThreadStateIterator it(state); 1653 1654 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1655 JvmtiEnv *env = ets->get_env(); 1656 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1657 continue; 1658 } 1659 if (ets->is_enabled((jvmtiEvent)EXT_EVENT_VIRTUAL_THREAD_MOUNT)) { 1660 EVT_TRACE(EXT_EVENT_VIRTUAL_THREAD_MOUNT, ("[%p] Evt Virtual Thread Mount event sent", vthread)); 1661 1662 JvmtiVirtualThreadEventMark jem(thread); 1663 JvmtiJavaThreadEventTransition jet(thread); 1664 jvmtiExtensionEvent callback = env->ext_callbacks()->VirtualThreadMount; 1665 if (callback != nullptr) { 1666 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); 1667 } 1668 } 1669 } 1670 } 1671 } 1672 1673 void JvmtiExport::post_vthread_unmount(jobject vthread) { 1674 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1675 return; 1676 } 1677 JavaThread *thread = JavaThread::current(); 1678 HandleMark hm(thread); 1679 EVT_TRIG_TRACE(EXT_EVENT_VIRTUAL_THREAD_UNMOUNT, ("[%p] Trg Virtual Thread Unmount event triggered", vthread)); 1680 1681 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1682 if (state == nullptr) { 1683 return; 1684 } 1685 1686 if (state->is_enabled((jvmtiEvent)EXT_EVENT_VIRTUAL_THREAD_UNMOUNT)) { 1687 JvmtiEnvThreadStateIterator it(state); 1688 1689 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1690 JvmtiEnv *env = ets->get_env(); 1691 if (env->phase() == JVMTI_PHASE_PRIMORDIAL) { 1692 continue; 1693 } 1694 if (ets->is_enabled((jvmtiEvent)EXT_EVENT_VIRTUAL_THREAD_UNMOUNT)) { 1695 EVT_TRACE(EXT_EVENT_VIRTUAL_THREAD_UNMOUNT, ("[%p] Evt Virtual Thread Unmount event sent", vthread)); 1696 1697 JvmtiVirtualThreadEventMark jem(thread); 1698 JvmtiJavaThreadEventTransition jet(thread); 1699 jvmtiExtensionEvent callback = env->ext_callbacks()->VirtualThreadUnmount; 1700 if (callback != nullptr) { 1701 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); 1702 } 1703 } 1704 } 1705 } 1706 } 1707 1708 void JvmtiExport::continuation_yield_cleanup(JavaThread* thread, jint continuation_frame_count) { 1709 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 1710 return; 1711 } 1712 1713 assert(thread == JavaThread::current(), "must be"); 1714 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1715 if (state == nullptr) { 1716 return; 1717 } 1718 state->invalidate_cur_stack_depth(); 1719 1720 // Clear frame_pop requests in frames popped by yield 1721 if (can_post_frame_pop()) { 1722 JvmtiEnvThreadStateIterator it(state); 1723 int top_frame_num = state->cur_stack_depth() + continuation_frame_count; 1724 1725 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1726 if (!ets->has_frame_pops()) { 1727 continue; 1728 } 1729 for (int frame_idx = 0; frame_idx < continuation_frame_count; frame_idx++) { 1730 int frame_num = top_frame_num - frame_idx; 1731 1732 if (!state->is_virtual() && ets->is_frame_pop(frame_num)) { 1733 // remove the frame's entry 1734 MutexLocker mu(JvmtiThreadState_lock); 1735 ets->clear_frame_pop(frame_num); 1736 } 1737 } 1738 } 1739 } 1740 } 1741 1742 void JvmtiExport::post_object_free(JvmtiEnv* env, GrowableArray<jlong>* objects) { 1743 assert(objects != nullptr, "Nothing to post"); 1744 1745 JavaThread *javaThread = JavaThread::current(); 1746 if (javaThread->is_in_any_VTMS_transition()) { 1747 return; // no events should be posted if thread is in any VTMS transition 1748 } 1749 if (!env->is_enabled(JVMTI_EVENT_OBJECT_FREE)) { 1750 return; // the event type has been already disabled 1751 } 1752 1753 EVT_TRIG_TRACE(JVMTI_EVENT_OBJECT_FREE, ("[?] Trg Object Free triggered" )); 1754 EVT_TRACE(JVMTI_EVENT_OBJECT_FREE, ("[?] Evt Object Free sent")); 1755 1756 JvmtiThreadEventMark jem(javaThread); 1757 JvmtiJavaThreadEventTransition jet(javaThread); 1758 jvmtiEventObjectFree callback = env->callbacks()->ObjectFree; 1759 if (callback != nullptr) { 1760 for (int index = 0; index < objects->length(); index++) { 1761 (*callback)(env->jvmti_external(), objects->at(index)); 1762 } 1763 } 1764 } 1765 1766 void JvmtiExport::post_resource_exhausted(jint resource_exhausted_flags, const char* description) { 1767 1768 JavaThread *thread = JavaThread::current(); 1769 1770 if (thread->is_in_any_VTMS_transition()) { 1771 return; // no events should be posted if thread is in any VTMS transition 1772 } 1773 1774 log_error(jvmti)("Posting Resource Exhausted event: %s", 1775 description != nullptr ? description : "unknown"); 1776 1777 // JDK-8213834: handlers of ResourceExhausted may attempt some analysis 1778 // which often requires running java. 1779 // This will cause problems on threads not able to run java, e.g. compiler 1780 // threads. To forestall these problems, we therefore suppress sending this 1781 // event from threads which are not able to run java. 1782 if (!thread->can_call_java()) { 1783 return; 1784 } 1785 1786 EVT_TRIG_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("Trg resource exhausted event triggered" )); 1787 1788 JvmtiEnvIterator it; 1789 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 1790 if (env->is_enabled(JVMTI_EVENT_RESOURCE_EXHAUSTED)) { 1791 EVT_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("Evt resource exhausted event sent" )); 1792 1793 JvmtiThreadEventMark jem(thread); 1794 JvmtiJavaThreadEventTransition jet(thread); 1795 jvmtiEventResourceExhausted callback = env->callbacks()->ResourceExhausted; 1796 if (callback != nullptr) { 1797 (*callback)(env->jvmti_external(), jem.jni_env(), 1798 resource_exhausted_flags, nullptr, description); 1799 } 1800 } 1801 } 1802 } 1803 1804 void JvmtiExport::post_method_entry(JavaThread *thread, Method* method, frame current_frame) { 1805 HandleMark hm(thread); 1806 methodHandle mh(thread, method); 1807 1808 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1809 if (state == nullptr || !state->is_interp_only_mode()) { 1810 // for any thread that actually wants method entry, interp_only_mode is set 1811 return; 1812 } 1813 if (mh->jvmti_mount_transition() || thread->is_in_any_VTMS_transition()) { 1814 return; // no events should be posted if thread is in any VTMS transition 1815 } 1816 EVT_TRIG_TRACE(JVMTI_EVENT_METHOD_ENTRY, ("[%s] Trg Method Entry triggered %s.%s", 1817 JvmtiTrace::safe_get_thread_name(thread), 1818 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1819 (mh() == nullptr) ? "null" : mh()->name()->as_C_string() )); 1820 1821 state->incr_cur_stack_depth(); 1822 1823 if (state->is_enabled(JVMTI_EVENT_METHOD_ENTRY)) { 1824 JvmtiEnvThreadStateIterator it(state); 1825 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1826 if (ets->is_enabled(JVMTI_EVENT_METHOD_ENTRY)) { 1827 EVT_TRACE(JVMTI_EVENT_METHOD_ENTRY, ("[%s] Evt Method Entry sent %s.%s", 1828 JvmtiTrace::safe_get_thread_name(thread), 1829 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1830 (mh() == nullptr) ? "null" : mh()->name()->as_C_string() )); 1831 1832 JvmtiEnv *env = ets->get_env(); 1833 JvmtiMethodEventMark jem(thread, mh); 1834 JvmtiJavaThreadEventTransition jet(thread); 1835 jvmtiEventMethodEntry callback = env->callbacks()->MethodEntry; 1836 if (callback != nullptr) { 1837 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_methodID()); 1838 } 1839 } 1840 } 1841 } 1842 } 1843 1844 void JvmtiExport::post_method_exit(JavaThread* thread, Method* method, frame current_frame) { 1845 HandleMark hm(thread); 1846 methodHandle mh(thread, method); 1847 1848 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1849 1850 if (state == nullptr || !state->is_interp_only_mode()) { 1851 // for any thread that actually wants method exit, interp_only_mode is set 1852 return; 1853 } 1854 1855 // return a flag when a method terminates by throwing an exception 1856 // i.e. if an exception is thrown and it's not caught by the current method 1857 bool exception_exit = state->is_exception_detected() && !state->is_exception_caught(); 1858 Handle result; 1859 jvalue value; 1860 value.j = 0L; 1861 1862 if (state->is_enabled(JVMTI_EVENT_METHOD_EXIT)) { 1863 // if the method hasn't been popped because of an exception then we populate 1864 // the return_value parameter for the callback. At this point we only have 1865 // the address of a "raw result" and we just call into the interpreter to 1866 // convert this into a jvalue. 1867 if (!exception_exit) { 1868 oop oop_result; 1869 BasicType type = current_frame.interpreter_frame_result(&oop_result, &value); 1870 if (is_reference_type(type)) { 1871 result = Handle(thread, oop_result); 1872 value.l = JNIHandles::make_local(thread, result()); 1873 } 1874 } 1875 } 1876 1877 // Deferred transition to VM, so we can stash away the return oop before GC 1878 // Note that this transition is not needed when throwing an exception, because 1879 // there is no oop to retain. 1880 JavaThread* current = thread; // for JRT_BLOCK 1881 JRT_BLOCK 1882 post_method_exit_inner(thread, mh, state, exception_exit, current_frame, value); 1883 JRT_BLOCK_END 1884 1885 if (result.not_null() && !mh->is_native()) { 1886 // We have to restore the oop on the stack for interpreter frames 1887 *(oop*)current_frame.interpreter_frame_tos_address() = result(); 1888 } 1889 } 1890 1891 void JvmtiExport::post_method_exit_inner(JavaThread* thread, 1892 methodHandle& mh, 1893 JvmtiThreadState *state, 1894 bool exception_exit, 1895 frame current_frame, 1896 jvalue& value) { 1897 if (mh->jvmti_mount_transition() || thread->is_in_any_VTMS_transition()) { 1898 return; // no events should be posted if thread is in any VTMS transition 1899 } 1900 1901 EVT_TRIG_TRACE(JVMTI_EVENT_METHOD_EXIT, ("[%s] Trg Method Exit triggered %s.%s", 1902 JvmtiTrace::safe_get_thread_name(thread), 1903 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1904 (mh() == nullptr) ? "null" : mh()->name()->as_C_string() )); 1905 1906 if (state->is_enabled(JVMTI_EVENT_METHOD_EXIT)) { 1907 JvmtiEnvThreadStateIterator it(state); 1908 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1909 if (ets->is_enabled(JVMTI_EVENT_METHOD_EXIT)) { 1910 EVT_TRACE(JVMTI_EVENT_METHOD_EXIT, ("[%s] Evt Method Exit sent %s.%s", 1911 JvmtiTrace::safe_get_thread_name(thread), 1912 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1913 (mh() == nullptr) ? "null" : mh()->name()->as_C_string() )); 1914 1915 JvmtiEnv *env = ets->get_env(); 1916 JvmtiMethodEventMark jem(thread, mh); 1917 JvmtiJavaThreadEventTransition jet(thread); 1918 jvmtiEventMethodExit callback = env->callbacks()->MethodExit; 1919 if (callback != nullptr) { 1920 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 1921 jem.jni_methodID(), exception_exit, value); 1922 } 1923 } 1924 } 1925 } 1926 1927 JvmtiEnvThreadStateIterator it(state); 1928 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1929 if (ets->has_frame_pops()) { 1930 int cur_frame_number = state->cur_stack_depth(); 1931 1932 if (ets->is_frame_pop(cur_frame_number)) { 1933 // we have a NotifyFramePop entry for this frame. 1934 // now check that this env/thread wants this event 1935 if (ets->is_enabled(JVMTI_EVENT_FRAME_POP)) { 1936 EVT_TRACE(JVMTI_EVENT_FRAME_POP, ("[%s] Evt Frame Pop sent %s.%s", 1937 JvmtiTrace::safe_get_thread_name(thread), 1938 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1939 (mh() == nullptr) ? "null" : mh()->name()->as_C_string() )); 1940 1941 // we also need to issue a frame pop event for this frame 1942 JvmtiEnv *env = ets->get_env(); 1943 JvmtiMethodEventMark jem(thread, mh); 1944 JvmtiJavaThreadEventTransition jet(thread); 1945 jvmtiEventFramePop callback = env->callbacks()->FramePop; 1946 if (callback != nullptr) { 1947 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 1948 jem.jni_methodID(), exception_exit); 1949 } 1950 } 1951 // remove the frame's entry 1952 { 1953 MutexLocker mu(JvmtiThreadState_lock); 1954 ets->clear_frame_pop(cur_frame_number); 1955 } 1956 } 1957 } 1958 } 1959 1960 state->decr_cur_stack_depth(); 1961 } 1962 1963 1964 // Todo: inline this for optimization 1965 void JvmtiExport::post_single_step(JavaThread *thread, Method* method, address location) { 1966 HandleMark hm(thread); 1967 methodHandle mh(thread, method); 1968 1969 JvmtiThreadState *state = get_jvmti_thread_state(thread); 1970 if (state == nullptr) { 1971 return; 1972 } 1973 if (mh->jvmti_mount_transition() || thread->is_in_any_VTMS_transition()) { 1974 return; // no events should be posted if thread is in any VTMS transition 1975 } 1976 1977 JvmtiEnvThreadStateIterator it(state); 1978 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 1979 ets->compare_and_set_current_location(mh(), location, JVMTI_EVENT_SINGLE_STEP); 1980 if (!ets->single_stepping_posted() && ets->is_enabled(JVMTI_EVENT_SINGLE_STEP)) { 1981 EVT_TRACE(JVMTI_EVENT_SINGLE_STEP, ("[%s] Evt Single Step sent %s.%s @ " INTX_FORMAT, 1982 JvmtiTrace::safe_get_thread_name(thread), 1983 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 1984 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 1985 location - mh()->code_base() )); 1986 1987 JvmtiEnv *env = ets->get_env(); 1988 JvmtiLocationEventMark jem(thread, mh, location); 1989 JvmtiJavaThreadEventTransition jet(thread); 1990 jvmtiEventSingleStep callback = env->callbacks()->SingleStep; 1991 if (callback != nullptr) { 1992 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 1993 jem.jni_methodID(), jem.location()); 1994 } 1995 1996 ets->set_single_stepping_posted(); 1997 } 1998 } 1999 } 2000 2001 void JvmtiExport::post_exception_throw(JavaThread *thread, Method* method, address location, oop exception) { 2002 HandleMark hm(thread); 2003 methodHandle mh(thread, method); 2004 Handle exception_handle(thread, exception); 2005 // The KeepStackGCProcessedMark below keeps the target thread and its stack fully 2006 // GC processed across this scope. This is needed because there is a stack walk 2007 // below with safepoint polls inside of it. After such safepoints, we have to 2008 // ensure the stack is sufficiently processed. 2009 KeepStackGCProcessedMark ksgcpm(thread); 2010 2011 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2012 if (state == nullptr) { 2013 return; 2014 } 2015 if (thread->is_in_any_VTMS_transition()) { 2016 return; // no events should be posted if thread is in any VTMS transition 2017 } 2018 2019 EVT_TRIG_TRACE(JVMTI_EVENT_EXCEPTION, ("[%s] Trg Exception thrown triggered", 2020 JvmtiTrace::safe_get_thread_name(thread))); 2021 if (!state->is_exception_detected()) { 2022 state->set_exception_detected(); 2023 JvmtiEnvThreadStateIterator it(state); 2024 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2025 if (ets->is_enabled(JVMTI_EVENT_EXCEPTION) && (exception != nullptr)) { 2026 2027 EVT_TRACE(JVMTI_EVENT_EXCEPTION, 2028 ("[%s] Evt Exception thrown sent %s.%s @ " INTX_FORMAT, 2029 JvmtiTrace::safe_get_thread_name(thread), 2030 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 2031 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 2032 location - mh()->code_base() )); 2033 2034 JvmtiEnv *env = ets->get_env(); 2035 JvmtiExceptionEventMark jem(thread, mh, location, exception_handle); 2036 2037 // It's okay to clear these exceptions here because we duplicate 2038 // this lookup in InterpreterRuntime::exception_handler_for_exception. 2039 EXCEPTION_MARK; 2040 2041 bool should_repeat; 2042 vframeStream st(thread); 2043 assert(!st.at_end(), "cannot be at end"); 2044 Method* current_method = nullptr; 2045 // A GC may occur during the Method::fast_exception_handler_bci_for() 2046 // call below if it needs to load the constraint class. Using a 2047 // methodHandle to keep the 'current_method' from being deallocated 2048 // if GC happens. 2049 methodHandle current_mh = methodHandle(thread, current_method); 2050 int current_bci = -1; 2051 do { 2052 current_method = st.method(); 2053 current_mh = methodHandle(thread, current_method); 2054 current_bci = st.bci(); 2055 do { 2056 should_repeat = false; 2057 Klass* eh_klass = exception_handle()->klass(); 2058 current_bci = Method::fast_exception_handler_bci_for( 2059 current_mh, eh_klass, current_bci, THREAD); 2060 if (HAS_PENDING_EXCEPTION) { 2061 exception_handle = Handle(thread, PENDING_EXCEPTION); 2062 CLEAR_PENDING_EXCEPTION; 2063 should_repeat = true; 2064 } 2065 } while (should_repeat && (current_bci != -1)); 2066 st.next(); 2067 } while ((current_bci < 0) && (!st.at_end())); 2068 2069 jmethodID catch_jmethodID; 2070 if (current_bci < 0) { 2071 catch_jmethodID = nullptr; 2072 current_bci = 0; 2073 } else { 2074 catch_jmethodID = jem.to_jmethodID(current_mh); 2075 } 2076 2077 JvmtiJavaThreadEventTransition jet(thread); 2078 jvmtiEventException callback = env->callbacks()->Exception; 2079 if (callback != nullptr) { 2080 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2081 jem.jni_methodID(), jem.location(), 2082 jem.exception(), 2083 catch_jmethodID, current_bci); 2084 } 2085 } 2086 } 2087 } 2088 2089 // frames may get popped because of this throw, be safe - invalidate cached depth 2090 state->invalidate_cur_stack_depth(); 2091 } 2092 2093 2094 void JvmtiExport::notice_unwind_due_to_exception(JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) { 2095 HandleMark hm(thread); 2096 methodHandle mh(thread, method); 2097 Handle exception_handle(thread, exception); 2098 2099 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2100 if (state == nullptr) { 2101 return; 2102 } 2103 EVT_TRIG_TRACE(JVMTI_EVENT_EXCEPTION_CATCH, 2104 ("[%s] Trg unwind_due_to_exception triggered %s.%s @ %s" INTX_FORMAT " - %s", 2105 JvmtiTrace::safe_get_thread_name(thread), 2106 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 2107 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 2108 location == nullptr ? "no location:" : "", 2109 location == nullptr ? 0 : location - mh()->code_base(), 2110 in_handler_frame? "in handler frame" : "not handler frame" )); 2111 2112 if (state->is_exception_detected()) { 2113 2114 state->invalidate_cur_stack_depth(); 2115 if (!in_handler_frame) { 2116 // Not in exception handler. 2117 if(state->is_interp_only_mode()) { 2118 // method exit and frame pop events are posted only in interp mode. 2119 // When these events are enabled code should be in running in interp mode. 2120 jvalue no_value; 2121 no_value.j = 0L; 2122 JvmtiExport::post_method_exit_inner(thread, mh, state, true, thread->last_frame(), no_value); 2123 // The cached cur_stack_depth might have changed from the 2124 // operations of frame pop or method exit. We are not 100% sure 2125 // the cached cur_stack_depth is still valid depth so invalidate 2126 // it. 2127 state->invalidate_cur_stack_depth(); 2128 } 2129 } else { 2130 // In exception handler frame. Report exception catch. 2131 assert(location != nullptr, "must be a known location"); 2132 // Update cur_stack_depth - the frames above the current frame 2133 // have been unwound due to this exception: 2134 assert(!state->is_exception_caught(), "exception must not be caught yet."); 2135 state->set_exception_caught(); 2136 2137 if (mh->jvmti_mount_transition() || thread->is_in_any_VTMS_transition()) { 2138 return; // no events should be posted if thread is in any VTMS transition 2139 } 2140 JvmtiEnvThreadStateIterator it(state); 2141 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2142 if (ets->is_enabled(JVMTI_EVENT_EXCEPTION_CATCH) && (exception_handle() != nullptr)) { 2143 EVT_TRACE(JVMTI_EVENT_EXCEPTION_CATCH, 2144 ("[%s] Evt ExceptionCatch sent %s.%s @ " INTX_FORMAT, 2145 JvmtiTrace::safe_get_thread_name(thread), 2146 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 2147 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 2148 location - mh()->code_base() )); 2149 2150 JvmtiEnv *env = ets->get_env(); 2151 JvmtiExceptionEventMark jem(thread, mh, location, exception_handle); 2152 JvmtiJavaThreadEventTransition jet(thread); 2153 jvmtiEventExceptionCatch callback = env->callbacks()->ExceptionCatch; 2154 if (callback != nullptr) { 2155 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2156 jem.jni_methodID(), jem.location(), 2157 jem.exception()); 2158 } 2159 } 2160 } 2161 } 2162 } 2163 } 2164 2165 oop JvmtiExport::jni_GetField_probe(JavaThread *thread, jobject jobj, oop obj, 2166 Klass* klass, jfieldID fieldID, bool is_static) { 2167 if (*((int *)get_field_access_count_addr()) > 0 && thread->has_last_Java_frame()) { 2168 // At least one field access watch is set so we have more work to do. 2169 post_field_access_by_jni(thread, obj, klass, fieldID, is_static); 2170 // event posting can block so refetch oop if we were passed a jobj 2171 if (jobj != nullptr) return JNIHandles::resolve_non_null(jobj); 2172 } 2173 return obj; 2174 } 2175 2176 void JvmtiExport::post_field_access_by_jni(JavaThread *thread, oop obj, 2177 Klass* klass, jfieldID fieldID, bool is_static) { 2178 // We must be called with a Java context in order to provide reasonable 2179 // values for the klazz, method, and location fields. The callers of this 2180 // function don't make the call unless there is a Java context. 2181 assert(thread->has_last_Java_frame(), "must be called with a Java context"); 2182 2183 if (thread->is_in_any_VTMS_transition()) { 2184 return; // no events should be posted if thread is in any VTMS transition 2185 } 2186 2187 ResourceMark rm; 2188 fieldDescriptor fd; 2189 // if get_field_descriptor finds fieldID to be invalid, then we just bail 2190 bool valid_fieldID = JvmtiEnv::get_field_descriptor(klass, fieldID, &fd); 2191 assert(valid_fieldID == true,"post_field_access_by_jni called with invalid fieldID"); 2192 if (!valid_fieldID) return; 2193 // field accesses are not watched so bail 2194 if (!fd.is_field_access_watched()) return; 2195 2196 HandleMark hm(thread); 2197 Handle h_obj; 2198 if (!is_static) { 2199 // non-static field accessors have an object, but we need a handle 2200 assert(obj != nullptr, "non-static needs an object"); 2201 h_obj = Handle(thread, obj); 2202 } 2203 post_field_access(thread, 2204 thread->last_frame().interpreter_frame_method(), 2205 thread->last_frame().interpreter_frame_bcp(), 2206 klass, h_obj, fieldID); 2207 } 2208 2209 void JvmtiExport::post_field_access(JavaThread *thread, Method* method, 2210 address location, Klass* field_klass, Handle object, jfieldID field) { 2211 2212 HandleMark hm(thread); 2213 methodHandle mh(thread, method); 2214 2215 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2216 if (state == nullptr) { 2217 return; 2218 } 2219 if (thread->is_in_any_VTMS_transition()) { 2220 return; // no events should be posted if thread is in any VTMS transition 2221 } 2222 2223 EVT_TRIG_TRACE(JVMTI_EVENT_FIELD_ACCESS, ("[%s] Trg Field Access event triggered", 2224 JvmtiTrace::safe_get_thread_name(thread))); 2225 JvmtiEnvThreadStateIterator it(state); 2226 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2227 if (ets->is_enabled(JVMTI_EVENT_FIELD_ACCESS)) { 2228 EVT_TRACE(JVMTI_EVENT_FIELD_ACCESS, ("[%s] Evt Field Access event sent %s.%s @ " INTX_FORMAT, 2229 JvmtiTrace::safe_get_thread_name(thread), 2230 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 2231 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 2232 location - mh()->code_base() )); 2233 2234 JvmtiEnv *env = ets->get_env(); 2235 JvmtiLocationEventMark jem(thread, mh, location); 2236 jclass field_jclass = jem.to_jclass(field_klass); 2237 jobject field_jobject = jem.to_jobject(object()); 2238 JvmtiJavaThreadEventTransition jet(thread); 2239 jvmtiEventFieldAccess callback = env->callbacks()->FieldAccess; 2240 if (callback != nullptr) { 2241 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2242 jem.jni_methodID(), jem.location(), 2243 field_jclass, field_jobject, field); 2244 } 2245 } 2246 } 2247 } 2248 2249 oop JvmtiExport::jni_SetField_probe(JavaThread *thread, jobject jobj, oop obj, 2250 Klass* klass, jfieldID fieldID, bool is_static, 2251 char sig_type, jvalue *value) { 2252 if (*((int *)get_field_modification_count_addr()) > 0 && thread->has_last_Java_frame()) { 2253 // At least one field modification watch is set so we have more work to do. 2254 post_field_modification_by_jni(thread, obj, klass, fieldID, is_static, sig_type, value); 2255 // event posting can block so refetch oop if we were passed a jobj 2256 if (jobj != nullptr) return JNIHandles::resolve_non_null(jobj); 2257 } 2258 return obj; 2259 } 2260 2261 void JvmtiExport::post_field_modification_by_jni(JavaThread *thread, oop obj, 2262 Klass* klass, jfieldID fieldID, bool is_static, 2263 char sig_type, jvalue *value) { 2264 // We must be called with a Java context in order to provide reasonable 2265 // values for the klazz, method, and location fields. The callers of this 2266 // function don't make the call unless there is a Java context. 2267 assert(thread->has_last_Java_frame(), "must be called with Java context"); 2268 2269 if (thread->is_in_any_VTMS_transition()) { 2270 return; // no events should be posted if thread is in any VTMS transition 2271 } 2272 2273 ResourceMark rm; 2274 fieldDescriptor fd; 2275 // if get_field_descriptor finds fieldID to be invalid, then we just bail 2276 bool valid_fieldID = JvmtiEnv::get_field_descriptor(klass, fieldID, &fd); 2277 assert(valid_fieldID == true,"post_field_modification_by_jni called with invalid fieldID"); 2278 if (!valid_fieldID) return; 2279 // field modifications are not watched so bail 2280 if (!fd.is_field_modification_watched()) return; 2281 2282 HandleMark hm(thread); 2283 2284 Handle h_obj; 2285 if (!is_static) { 2286 // non-static field accessors have an object, but we need a handle 2287 assert(obj != nullptr, "non-static needs an object"); 2288 h_obj = Handle(thread, obj); 2289 } 2290 post_field_modification(thread, 2291 thread->last_frame().interpreter_frame_method(), 2292 thread->last_frame().interpreter_frame_bcp(), 2293 klass, h_obj, fieldID, sig_type, value); 2294 } 2295 2296 void JvmtiExport::post_raw_field_modification(JavaThread *thread, Method* method, 2297 address location, Klass* field_klass, Handle object, jfieldID field, 2298 char sig_type, jvalue *value) { 2299 2300 if (thread->is_in_any_VTMS_transition()) { 2301 return; // no events should be posted if thread is in any VTMS transition 2302 } 2303 2304 if (sig_type == JVM_SIGNATURE_INT || sig_type == JVM_SIGNATURE_BOOLEAN || 2305 sig_type == JVM_SIGNATURE_BYTE || sig_type == JVM_SIGNATURE_CHAR || 2306 sig_type == JVM_SIGNATURE_SHORT) { 2307 // 'I' instructions are used for byte, char, short and int. 2308 // determine which it really is, and convert 2309 fieldDescriptor fd; 2310 bool found = JvmtiEnv::get_field_descriptor(field_klass, field, &fd); 2311 // should be found (if not, leave as is) 2312 if (found) { 2313 jint ival = value->i; 2314 // convert value from int to appropriate type 2315 switch (fd.field_type()) { 2316 case T_BOOLEAN: 2317 sig_type = JVM_SIGNATURE_BOOLEAN; 2318 value->i = 0; // clear it 2319 value->z = (jboolean)ival; 2320 break; 2321 case T_BYTE: 2322 sig_type = JVM_SIGNATURE_BYTE; 2323 value->i = 0; // clear it 2324 value->b = (jbyte)ival; 2325 break; 2326 case T_CHAR: 2327 sig_type = JVM_SIGNATURE_CHAR; 2328 value->i = 0; // clear it 2329 value->c = (jchar)ival; 2330 break; 2331 case T_SHORT: 2332 sig_type = JVM_SIGNATURE_SHORT; 2333 value->i = 0; // clear it 2334 value->s = (jshort)ival; 2335 break; 2336 case T_INT: 2337 // nothing to do 2338 break; 2339 default: 2340 // this is an integer instruction, should be one of above 2341 ShouldNotReachHere(); 2342 break; 2343 } 2344 } 2345 } 2346 2347 assert(sig_type != JVM_SIGNATURE_ARRAY, "array should have sig_type == 'L'"); 2348 bool handle_created = false; 2349 2350 // convert oop to JNI handle. 2351 if (sig_type == JVM_SIGNATURE_CLASS) { 2352 handle_created = true; 2353 value->l = (jobject)JNIHandles::make_local(thread, cast_to_oop(value->l)); 2354 } 2355 2356 post_field_modification(thread, method, location, field_klass, object, field, sig_type, value); 2357 2358 // Destroy the JNI handle allocated above. 2359 if (handle_created) { 2360 JNIHandles::destroy_local(value->l); 2361 } 2362 } 2363 2364 void JvmtiExport::post_field_modification(JavaThread *thread, Method* method, 2365 address location, Klass* field_klass, Handle object, jfieldID field, 2366 char sig_type, jvalue *value_ptr) { 2367 2368 HandleMark hm(thread); 2369 methodHandle mh(thread, method); 2370 2371 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2372 if (state == nullptr) { 2373 return; 2374 } 2375 if (thread->is_in_any_VTMS_transition()) { 2376 return; // no events should be posted if thread is in any VTMS transition 2377 } 2378 2379 EVT_TRIG_TRACE(JVMTI_EVENT_FIELD_MODIFICATION, 2380 ("[%s] Trg Field Modification event triggered", 2381 JvmtiTrace::safe_get_thread_name(thread))); 2382 JvmtiEnvThreadStateIterator it(state); 2383 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2384 if (ets->is_enabled(JVMTI_EVENT_FIELD_MODIFICATION)) { 2385 EVT_TRACE(JVMTI_EVENT_FIELD_MODIFICATION, 2386 ("[%s] Evt Field Modification event sent %s.%s @ " INTX_FORMAT, 2387 JvmtiTrace::safe_get_thread_name(thread), 2388 (mh() == nullptr) ? "null" : mh()->klass_name()->as_C_string(), 2389 (mh() == nullptr) ? "null" : mh()->name()->as_C_string(), 2390 location - mh()->code_base() )); 2391 2392 JvmtiEnv *env = ets->get_env(); 2393 JvmtiLocationEventMark jem(thread, mh, location); 2394 jclass field_jclass = jem.to_jclass(field_klass); 2395 jobject field_jobject = jem.to_jobject(object()); 2396 JvmtiJavaThreadEventTransition jet(thread); 2397 jvmtiEventFieldModification callback = env->callbacks()->FieldModification; 2398 if (callback != nullptr) { 2399 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2400 jem.jni_methodID(), jem.location(), 2401 field_jclass, field_jobject, field, sig_type, *value_ptr); 2402 } 2403 } 2404 } 2405 } 2406 2407 void JvmtiExport::post_native_method_bind(Method* method, address* function_ptr) { 2408 JavaThread* thread = JavaThread::current(); 2409 assert(thread->thread_state() == _thread_in_vm, "must be in vm state"); 2410 2411 HandleMark hm(thread); 2412 methodHandle mh(thread, method); 2413 2414 if (thread->is_in_any_VTMS_transition()) { 2415 return; // no events should be posted if thread is in any VTMS transition 2416 } 2417 EVT_TRIG_TRACE(JVMTI_EVENT_NATIVE_METHOD_BIND, ("[%s] Trg Native Method Bind event triggered", 2418 JvmtiTrace::safe_get_thread_name(thread))); 2419 2420 if (JvmtiEventController::is_enabled(JVMTI_EVENT_NATIVE_METHOD_BIND)) { 2421 JvmtiEnvIterator it; 2422 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2423 if (env->is_enabled(JVMTI_EVENT_NATIVE_METHOD_BIND)) { 2424 EVT_TRACE(JVMTI_EVENT_NATIVE_METHOD_BIND, ("[%s] Evt Native Method Bind event sent", 2425 JvmtiTrace::safe_get_thread_name(thread) )); 2426 2427 JvmtiMethodEventMark jem(thread, mh); 2428 JvmtiJavaThreadEventTransition jet(thread); 2429 JNIEnv* jni_env = (env->phase() == JVMTI_PHASE_PRIMORDIAL) ? nullptr : jem.jni_env(); 2430 jvmtiEventNativeMethodBind callback = env->callbacks()->NativeMethodBind; 2431 if (callback != nullptr) { 2432 (*callback)(env->jvmti_external(), jni_env, jem.jni_thread(), 2433 jem.jni_methodID(), (void*)(*function_ptr), (void**)function_ptr); 2434 } 2435 } 2436 } 2437 } 2438 } 2439 2440 // Returns a record containing inlining information for the given nmethod 2441 static jvmtiCompiledMethodLoadInlineRecord* create_inline_record(nmethod* nm) { 2442 jint numstackframes = 0; 2443 jvmtiCompiledMethodLoadInlineRecord* record = (jvmtiCompiledMethodLoadInlineRecord*)NEW_RESOURCE_OBJ(jvmtiCompiledMethodLoadInlineRecord); 2444 record->header.kind = JVMTI_CMLR_INLINE_INFO; 2445 record->header.next = nullptr; 2446 record->header.majorinfoversion = JVMTI_CMLR_MAJOR_VERSION_1; 2447 record->header.minorinfoversion = JVMTI_CMLR_MINOR_VERSION_0; 2448 record->numpcs = 0; 2449 for(PcDesc* p = nm->scopes_pcs_begin(); p < nm->scopes_pcs_end(); p++) { 2450 if(p->scope_decode_offset() == DebugInformationRecorder::serialized_null) continue; 2451 record->numpcs++; 2452 } 2453 record->pcinfo = (PCStackInfo*)(NEW_RESOURCE_ARRAY(PCStackInfo, record->numpcs)); 2454 int scope = 0; 2455 for(PcDesc* p = nm->scopes_pcs_begin(); p < nm->scopes_pcs_end(); p++) { 2456 if(p->scope_decode_offset() == DebugInformationRecorder::serialized_null) continue; 2457 void* pc_address = (void*)p->real_pc(nm); 2458 assert(pc_address != nullptr, "pc_address must be non-null"); 2459 record->pcinfo[scope].pc = pc_address; 2460 numstackframes=0; 2461 for(ScopeDesc* sd = nm->scope_desc_at(p->real_pc(nm));sd != nullptr;sd = sd->sender()) { 2462 numstackframes++; 2463 } 2464 assert(numstackframes != 0, "numstackframes must be nonzero."); 2465 record->pcinfo[scope].methods = (jmethodID *)NEW_RESOURCE_ARRAY(jmethodID, numstackframes); 2466 record->pcinfo[scope].bcis = (jint *)NEW_RESOURCE_ARRAY(jint, numstackframes); 2467 record->pcinfo[scope].numstackframes = numstackframes; 2468 int stackframe = 0; 2469 for(ScopeDesc* sd = nm->scope_desc_at(p->real_pc(nm));sd != nullptr;sd = sd->sender()) { 2470 // sd->method() can be null for stubs but not for nmethods. To be completely robust, include an assert that we should never see a null sd->method() 2471 guarantee(sd->method() != nullptr, "sd->method() cannot be null."); 2472 record->pcinfo[scope].methods[stackframe] = sd->method()->jmethod_id(); 2473 record->pcinfo[scope].bcis[stackframe] = sd->bci(); 2474 stackframe++; 2475 } 2476 scope++; 2477 } 2478 return record; 2479 } 2480 2481 void JvmtiExport::post_compiled_method_load(nmethod *nm) { 2482 guarantee(!nm->is_unloading(), "nmethod isn't unloaded or unloading"); 2483 if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { 2484 return; 2485 } 2486 JavaThread* thread = JavaThread::current(); 2487 2488 assert(!thread->is_in_any_VTMS_transition(), "compiled method load events are not allowed in any VTMS transition"); 2489 2490 EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD, 2491 ("[%s] method compile load event triggered", 2492 JvmtiTrace::safe_get_thread_name(thread))); 2493 2494 JvmtiEnvIterator it; 2495 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2496 post_compiled_method_load(env, nm); 2497 } 2498 } 2499 2500 // post a COMPILED_METHOD_LOAD event for a given environment 2501 void JvmtiExport::post_compiled_method_load(JvmtiEnv* env, nmethod *nm) { 2502 if (env->phase() == JVMTI_PHASE_PRIMORDIAL || !env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_LOAD)) { 2503 return; 2504 } 2505 jvmtiEventCompiledMethodLoad callback = env->callbacks()->CompiledMethodLoad; 2506 if (callback == nullptr) { 2507 return; 2508 } 2509 JavaThread* thread = JavaThread::current(); 2510 2511 assert(!thread->is_in_any_VTMS_transition(), "compiled method load events are not allowed in any VTMS transition"); 2512 2513 EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD, 2514 ("[%s] method compile load event sent %s.%s ", 2515 JvmtiTrace::safe_get_thread_name(thread), 2516 (nm->method() == nullptr) ? "null" : nm->method()->klass_name()->as_C_string(), 2517 (nm->method() == nullptr) ? "null" : nm->method()->name()->as_C_string())); 2518 ResourceMark rm(thread); 2519 HandleMark hm(thread); 2520 2521 // Add inlining information 2522 jvmtiCompiledMethodLoadInlineRecord* inlinerecord = create_inline_record(nm); 2523 // Pass inlining information through the void pointer 2524 JvmtiCompiledMethodLoadEventMark jem(thread, nm, inlinerecord); 2525 JvmtiJavaThreadEventTransition jet(thread); 2526 (*callback)(env->jvmti_external(), jem.jni_methodID(), 2527 jem.code_size(), jem.code_data(), jem.map_length(), 2528 jem.map(), jem.compile_info()); 2529 } 2530 2531 void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) { 2532 assert(name != nullptr && name[0] != '\0', "sanity check"); 2533 2534 JavaThread* thread = JavaThread::current(); 2535 2536 assert(!thread->is_in_any_VTMS_transition(), "dynamic code generated events are not allowed in any VTMS transition"); 2537 2538 // In theory everyone coming thru here is in_vm but we need to be certain 2539 // because a callee will do a vm->native transition 2540 ThreadInVMfromUnknown __tiv; 2541 2542 EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED, 2543 ("[%s] method dynamic code generated event triggered", 2544 JvmtiTrace::safe_get_thread_name(thread))); 2545 JvmtiEnvIterator it; 2546 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2547 if (env->is_enabled(JVMTI_EVENT_DYNAMIC_CODE_GENERATED)) { 2548 EVT_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED, 2549 ("[%s] dynamic code generated event sent for %s", 2550 JvmtiTrace::safe_get_thread_name(thread), name)); 2551 JvmtiEventMark jem(thread); 2552 JvmtiJavaThreadEventTransition jet(thread); 2553 jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char)); 2554 jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated; 2555 if (callback != nullptr) { 2556 (*callback)(env->jvmti_external(), name, (void*)code_begin, length); 2557 } 2558 } 2559 } 2560 } 2561 2562 void JvmtiExport::post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) { 2563 jvmtiPhase phase = JvmtiEnv::get_phase(); 2564 if (phase == JVMTI_PHASE_PRIMORDIAL || phase == JVMTI_PHASE_START) { 2565 post_dynamic_code_generated_internal(name, code_begin, code_end); 2566 } else { 2567 // It may not be safe to post the event from this thread. Defer all 2568 // postings to the service thread so that it can perform them in a safe 2569 // context and in-order. 2570 JvmtiDeferredEvent event = JvmtiDeferredEvent::dynamic_code_generated_event( 2571 name, code_begin, code_end); 2572 ServiceThread::enqueue_deferred_event(&event); 2573 } 2574 } 2575 2576 2577 // post a DYNAMIC_CODE_GENERATED event for a given environment 2578 // used by GenerateEvents 2579 void JvmtiExport::post_dynamic_code_generated(JvmtiEnv* env, const char *name, 2580 const void *code_begin, const void *code_end) 2581 { 2582 JavaThread* thread = JavaThread::current(); 2583 2584 assert(!thread->is_in_any_VTMS_transition(), "dynamic code generated events are not allowed in any VTMS transition"); 2585 2586 EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED, 2587 ("[%s] dynamic code generated event triggered (by GenerateEvents)", 2588 JvmtiTrace::safe_get_thread_name(thread))); 2589 if (env->is_enabled(JVMTI_EVENT_DYNAMIC_CODE_GENERATED)) { 2590 EVT_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED, 2591 ("[%s] dynamic code generated event sent for %s", 2592 JvmtiTrace::safe_get_thread_name(thread), name)); 2593 JvmtiEventMark jem(thread); 2594 JvmtiJavaThreadEventTransition jet(thread); 2595 jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char)); 2596 jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated; 2597 if (callback != nullptr) { 2598 (*callback)(env->jvmti_external(), name, (void*)code_begin, length); 2599 } 2600 } 2601 } 2602 2603 // post a DynamicCodeGenerated event while holding locks in the VM. 2604 void JvmtiExport::post_dynamic_code_generated_while_holding_locks(const char* name, 2605 address code_begin, address code_end) 2606 { 2607 JavaThread* thread = JavaThread::current(); 2608 // register the stub with the current dynamic code event collector 2609 // Cannot take safepoint here so do not use state_for to get 2610 // jvmti thread state. 2611 // The collector and/or state might be null if JvmtiDynamicCodeEventCollector 2612 // has been initialized while JVMTI_EVENT_DYNAMIC_CODE_GENERATED was disabled. 2613 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2614 if (state != nullptr) { 2615 JvmtiDynamicCodeEventCollector *collector = state->get_dynamic_code_event_collector(); 2616 if (collector != nullptr) { 2617 collector->register_stub(name, code_begin, code_end); 2618 } 2619 } 2620 } 2621 2622 // Collect all the vm internally allocated objects which are visible to java world 2623 void JvmtiExport::record_vm_internal_object_allocation(oop obj) { 2624 Thread* thread = Thread::current_or_null(); 2625 if (thread != nullptr && thread->is_Java_thread()) { 2626 // Can not take safepoint here. 2627 NoSafepointVerifier no_sfpt; 2628 // Cannot take safepoint here so do not use state_for to get 2629 // jvmti thread state. 2630 JvmtiThreadState *state = JavaThread::cast(thread)->jvmti_thread_state(); 2631 if (state != nullptr) { 2632 // state is non null when VMObjectAllocEventCollector is enabled. 2633 JvmtiVMObjectAllocEventCollector *collector; 2634 collector = state->get_vm_object_alloc_event_collector(); 2635 if (collector != nullptr && collector->is_enabled()) { 2636 // Don't record classes as these will be notified via the ClassLoad 2637 // event. 2638 if (obj->klass() != vmClasses::Class_klass()) { 2639 collector->record_allocation(obj); 2640 } 2641 } 2642 } 2643 } 2644 } 2645 2646 // Collect all the sampled allocated objects. 2647 void JvmtiExport::record_sampled_internal_object_allocation(oop obj) { 2648 Thread* thread = Thread::current_or_null(); 2649 if (thread != nullptr && thread->is_Java_thread()) { 2650 // Can not take safepoint here. 2651 NoSafepointVerifier no_sfpt; 2652 // Cannot take safepoint here so do not use state_for to get 2653 // jvmti thread state. 2654 JvmtiThreadState *state = JavaThread::cast(thread)->jvmti_thread_state(); 2655 if (state != nullptr) { 2656 // state is non null when SampledObjectAllocEventCollector is enabled. 2657 JvmtiSampledObjectAllocEventCollector *collector; 2658 collector = state->get_sampled_object_alloc_event_collector(); 2659 2660 if (collector != nullptr && collector->is_enabled()) { 2661 collector->record_allocation(obj); 2662 } 2663 } 2664 } 2665 } 2666 2667 void JvmtiExport::post_garbage_collection_finish() { 2668 Thread *thread = Thread::current(); // this event is posted from VM-Thread. 2669 EVT_TRIG_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, 2670 ("[%s] garbage collection finish event triggered", 2671 JvmtiTrace::safe_get_thread_name(thread))); 2672 JvmtiEnvIterator it; 2673 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2674 if (env->is_enabled(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH)) { 2675 EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, 2676 ("[%s] garbage collection finish event sent", 2677 JvmtiTrace::safe_get_thread_name(thread))); 2678 JvmtiThreadEventTransition jet(thread); 2679 // JNIEnv is null here because this event is posted from VM Thread 2680 jvmtiEventGarbageCollectionFinish callback = env->callbacks()->GarbageCollectionFinish; 2681 if (callback != nullptr) { 2682 (*callback)(env->jvmti_external()); 2683 } 2684 } 2685 } 2686 } 2687 2688 void JvmtiExport::post_garbage_collection_start() { 2689 Thread* thread = Thread::current(); // this event is posted from vm-thread. 2690 EVT_TRIG_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START, 2691 ("[%s] garbage collection start event triggered", 2692 JvmtiTrace::safe_get_thread_name(thread))); 2693 JvmtiEnvIterator it; 2694 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2695 if (env->is_enabled(JVMTI_EVENT_GARBAGE_COLLECTION_START)) { 2696 EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START, 2697 ("[%s] garbage collection start event sent", 2698 JvmtiTrace::safe_get_thread_name(thread))); 2699 JvmtiThreadEventTransition jet(thread); 2700 // JNIEnv is null here because this event is posted from VM Thread 2701 jvmtiEventGarbageCollectionStart callback = env->callbacks()->GarbageCollectionStart; 2702 if (callback != nullptr) { 2703 (*callback)(env->jvmti_external()); 2704 } 2705 } 2706 } 2707 } 2708 2709 void JvmtiExport::post_data_dump() { 2710 Thread *thread = Thread::current(); 2711 EVT_TRIG_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST, 2712 ("[%s] data dump request event triggered", 2713 JvmtiTrace::safe_get_thread_name(thread))); 2714 JvmtiEnvIterator it; 2715 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2716 if (env->is_enabled(JVMTI_EVENT_DATA_DUMP_REQUEST)) { 2717 EVT_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST, 2718 ("[%s] data dump request event sent", 2719 JvmtiTrace::safe_get_thread_name(thread))); 2720 JvmtiThreadEventTransition jet(thread); 2721 // JNIEnv is null here because this event is posted from VM Thread 2722 jvmtiEventDataDumpRequest callback = env->callbacks()->DataDumpRequest; 2723 if (callback != nullptr) { 2724 (*callback)(env->jvmti_external()); 2725 } 2726 } 2727 } 2728 } 2729 2730 void JvmtiExport::post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) { 2731 oop object = obj_mntr->object(); 2732 HandleMark hm(thread); 2733 Handle h(thread, object); 2734 2735 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2736 if (state == nullptr) { 2737 return; 2738 } 2739 if (thread->is_in_any_VTMS_transition()) { 2740 return; // no events should be posted if thread is in any VTMS transition 2741 } 2742 2743 EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTER, 2744 ("[%s] monitor contended enter event triggered", 2745 JvmtiTrace::safe_get_thread_name(thread))); 2746 JvmtiEnvThreadStateIterator it(state); 2747 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2748 if (ets->is_enabled(JVMTI_EVENT_MONITOR_CONTENDED_ENTER)) { 2749 EVT_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTER, 2750 ("[%s] monitor contended enter event sent", 2751 JvmtiTrace::safe_get_thread_name(thread))); 2752 JvmtiMonitorEventMark jem(thread, h()); 2753 JvmtiEnv *env = ets->get_env(); 2754 JvmtiThreadEventTransition jet(thread); 2755 jvmtiEventMonitorContendedEnter callback = env->callbacks()->MonitorContendedEnter; 2756 if (callback != nullptr) { 2757 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object()); 2758 } 2759 } 2760 } 2761 } 2762 2763 void JvmtiExport::post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) { 2764 oop object = obj_mntr->object(); 2765 HandleMark hm(thread); 2766 Handle h(thread, object); 2767 2768 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2769 if (state == nullptr) { 2770 return; 2771 } 2772 if (thread->is_in_any_VTMS_transition()) { 2773 return; // no events should be posted if thread is in any VTMS transition 2774 } 2775 2776 EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, 2777 ("[%s] monitor contended entered event triggered", 2778 JvmtiTrace::safe_get_thread_name(thread))); 2779 2780 JvmtiEnvThreadStateIterator it(state); 2781 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2782 if (ets->is_enabled(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED)) { 2783 EVT_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, 2784 ("[%s] monitor contended enter event sent", 2785 JvmtiTrace::safe_get_thread_name(thread))); 2786 JvmtiMonitorEventMark jem(thread, h()); 2787 JvmtiEnv *env = ets->get_env(); 2788 JvmtiThreadEventTransition jet(thread); 2789 jvmtiEventMonitorContendedEntered callback = env->callbacks()->MonitorContendedEntered; 2790 if (callback != nullptr) { 2791 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object()); 2792 } 2793 } 2794 } 2795 } 2796 2797 void JvmtiExport::post_monitor_wait(JavaThread *thread, oop object, 2798 jlong timeout) { 2799 HandleMark hm(thread); 2800 Handle h(thread, object); 2801 2802 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2803 if (state == nullptr) { 2804 return; 2805 } 2806 if (thread->is_in_any_VTMS_transition()) { 2807 return; // no events should be posted if thread is in any VTMS transition 2808 } 2809 2810 EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_WAIT, 2811 ("[%s] monitor wait event triggered", 2812 JvmtiTrace::safe_get_thread_name(thread))); 2813 JvmtiEnvThreadStateIterator it(state); 2814 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2815 if (ets->is_enabled(JVMTI_EVENT_MONITOR_WAIT)) { 2816 EVT_TRACE(JVMTI_EVENT_MONITOR_WAIT, 2817 ("[%s] monitor wait event sent", 2818 JvmtiTrace::safe_get_thread_name(thread))); 2819 JvmtiMonitorEventMark jem(thread, h()); 2820 JvmtiEnv *env = ets->get_env(); 2821 JvmtiThreadEventTransition jet(thread); 2822 jvmtiEventMonitorWait callback = env->callbacks()->MonitorWait; 2823 if (callback != nullptr) { 2824 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2825 jem.jni_object(), timeout); 2826 } 2827 } 2828 } 2829 } 2830 2831 void JvmtiExport::post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) { 2832 oop object = obj_mntr->object(); 2833 HandleMark hm(thread); 2834 Handle h(thread, object); 2835 2836 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2837 if (state == nullptr) { 2838 return; 2839 } 2840 if (thread->is_in_any_VTMS_transition()) { 2841 return; // no events should be posted if thread is in any VTMS transition 2842 } 2843 2844 EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_WAITED, 2845 ("[%s] monitor waited event triggered", 2846 JvmtiTrace::safe_get_thread_name(thread))); 2847 JvmtiEnvThreadStateIterator it(state); 2848 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2849 if (ets->is_enabled(JVMTI_EVENT_MONITOR_WAITED)) { 2850 EVT_TRACE(JVMTI_EVENT_MONITOR_WAITED, 2851 ("[%s] monitor waited event sent", 2852 JvmtiTrace::safe_get_thread_name(thread))); 2853 JvmtiMonitorEventMark jem(thread, h()); 2854 JvmtiEnv *env = ets->get_env(); 2855 JvmtiThreadEventTransition jet(thread); 2856 jvmtiEventMonitorWaited callback = env->callbacks()->MonitorWaited; 2857 if (callback != nullptr) { 2858 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2859 jem.jni_object(), timed_out); 2860 } 2861 } 2862 } 2863 } 2864 2865 void JvmtiExport::post_vm_object_alloc(JavaThread *thread, oop object) { 2866 if (object == nullptr) { 2867 return; 2868 } 2869 if (thread->is_in_any_VTMS_transition()) { 2870 return; // no events should be posted if thread is in any VTMS transition 2871 } 2872 HandleMark hm(thread); 2873 Handle h(thread, object); 2874 2875 EVT_TRIG_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("[%s] Trg vm object alloc triggered", 2876 JvmtiTrace::safe_get_thread_name(thread))); 2877 JvmtiEnvIterator it; 2878 for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { 2879 if (env->is_enabled(JVMTI_EVENT_VM_OBJECT_ALLOC)) { 2880 EVT_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("[%s] Evt vmobject alloc sent %s", 2881 JvmtiTrace::safe_get_thread_name(thread), 2882 object==nullptr? "null" : object->klass()->external_name())); 2883 2884 JvmtiObjectAllocEventMark jem(thread, h()); 2885 JvmtiJavaThreadEventTransition jet(thread); 2886 jvmtiEventVMObjectAlloc callback = env->callbacks()->VMObjectAlloc; 2887 if (callback != nullptr) { 2888 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2889 jem.jni_jobject(), jem.jni_class(), jem.size()); 2890 } 2891 } 2892 } 2893 } 2894 2895 void JvmtiExport::post_sampled_object_alloc(JavaThread *thread, oop object) { 2896 HandleMark hm(thread); 2897 Handle h(thread, object); 2898 2899 JvmtiThreadState *state = get_jvmti_thread_state(thread); 2900 if (state == nullptr) { 2901 return; 2902 } 2903 if (object == nullptr) { 2904 return; 2905 } 2906 if (thread->is_in_any_VTMS_transition()) { 2907 return; // no events should be posted if thread is in any VTMS transition 2908 } 2909 2910 EVT_TRIG_TRACE(JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, 2911 ("[%s] Trg sampled object alloc triggered", 2912 JvmtiTrace::safe_get_thread_name(thread))); 2913 JvmtiEnvThreadStateIterator it(state); 2914 for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) { 2915 if (ets->is_enabled(JVMTI_EVENT_SAMPLED_OBJECT_ALLOC)) { 2916 EVT_TRACE(JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, 2917 ("[%s] Evt sampled object alloc sent %s", 2918 JvmtiTrace::safe_get_thread_name(thread), 2919 object == nullptr ? "null" : object->klass()->external_name())); 2920 2921 JvmtiEnv *env = ets->get_env(); 2922 JvmtiObjectAllocEventMark jem(thread, h()); 2923 JvmtiJavaThreadEventTransition jet(thread); 2924 jvmtiEventSampledObjectAlloc callback = env->callbacks()->SampledObjectAlloc; 2925 if (callback != nullptr) { 2926 (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), 2927 jem.jni_jobject(), jem.jni_class(), jem.size()); 2928 } 2929 } 2930 } 2931 } 2932 2933 //////////////////////////////////////////////////////////////////////////////////////////////// 2934 2935 void JvmtiExport::cleanup_thread(JavaThread* thread) { 2936 assert(JavaThread::current() == thread, "thread is not current"); 2937 MutexLocker mu(thread, JvmtiThreadState_lock); 2938 2939 if (thread->jvmti_thread_state() != nullptr) { 2940 // This has to happen after the thread state is removed, which is 2941 // why it is not in post_thread_end_event like its complement 2942 // Maybe both these functions should be rolled into the posts? 2943 JvmtiEventController::thread_ended(thread); 2944 } 2945 } 2946 2947 void JvmtiExport::clear_detected_exception(JavaThread* thread) { 2948 assert(JavaThread::current() == thread, "thread is not current"); 2949 2950 JvmtiThreadState* state = thread->jvmti_thread_state(); 2951 if (state != nullptr) { 2952 state->clear_exception_state(); 2953 } 2954 } 2955 2956 // Onload raw monitor transition. 2957 void JvmtiExport::transition_pending_onload_raw_monitors() { 2958 JvmtiPendingMonitors::transition_raw_monitors(); 2959 } 2960 2961 // Setup current current thread for event collection. 2962 void JvmtiEventCollector::setup_jvmti_thread_state() { 2963 // set this event collector to be the current one. 2964 JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current()); 2965 // state can only be null if the current thread is exiting which 2966 // should not happen since we're trying to configure for event collection 2967 guarantee(state != nullptr, "exiting thread called setup_jvmti_thread_state"); 2968 if (is_vm_object_alloc_event()) { 2969 JvmtiVMObjectAllocEventCollector *prev = state->get_vm_object_alloc_event_collector(); 2970 2971 // If we have a previous collector and it is disabled, it means this allocation came from a 2972 // callback induced VM Object allocation, do not register this collector then. 2973 if (prev && !prev->is_enabled()) { 2974 return; 2975 } 2976 _prev = prev; 2977 state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)this); 2978 } else if (is_dynamic_code_event()) { 2979 _prev = state->get_dynamic_code_event_collector(); 2980 state->set_dynamic_code_event_collector((JvmtiDynamicCodeEventCollector *)this); 2981 } else if (is_sampled_object_alloc_event()) { 2982 JvmtiSampledObjectAllocEventCollector *prev = state->get_sampled_object_alloc_event_collector(); 2983 2984 if (prev) { 2985 // JvmtiSampledObjectAllocEventCollector wants only one active collector 2986 // enabled. This allows to have a collector detect a user code requiring 2987 // a sample in the callback. 2988 return; 2989 } 2990 state->set_sampled_object_alloc_event_collector((JvmtiSampledObjectAllocEventCollector*) this); 2991 } 2992 2993 _unset_jvmti_thread_state = true; 2994 } 2995 2996 // Unset current event collection in this thread and reset it with previous 2997 // collector. 2998 void JvmtiEventCollector::unset_jvmti_thread_state() { 2999 if (!_unset_jvmti_thread_state) { 3000 return; 3001 } 3002 3003 JvmtiThreadState* state = JavaThread::current()->jvmti_thread_state(); 3004 if (state != nullptr) { 3005 // restore the previous event collector (if any) 3006 if (is_vm_object_alloc_event()) { 3007 if (state->get_vm_object_alloc_event_collector() == this) { 3008 state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)_prev); 3009 } else { 3010 // this thread's jvmti state was created during the scope of 3011 // the event collector. 3012 } 3013 } else if (is_dynamic_code_event()) { 3014 if (state->get_dynamic_code_event_collector() == this) { 3015 state->set_dynamic_code_event_collector((JvmtiDynamicCodeEventCollector *)_prev); 3016 } else { 3017 // this thread's jvmti state was created during the scope of 3018 // the event collector. 3019 } 3020 } else if (is_sampled_object_alloc_event()) { 3021 if (state->get_sampled_object_alloc_event_collector() == this) { 3022 state->set_sampled_object_alloc_event_collector((JvmtiSampledObjectAllocEventCollector*)_prev); 3023 } else { 3024 // this thread's jvmti state was created during the scope of 3025 // the event collector. 3026 } 3027 } 3028 } 3029 } 3030 3031 // create the dynamic code event collector 3032 JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(nullptr) { 3033 if (JvmtiExport::should_post_dynamic_code_generated()) { 3034 setup_jvmti_thread_state(); 3035 } 3036 } 3037 3038 // iterate over any code blob descriptors collected and post a 3039 // DYNAMIC_CODE_GENERATED event to the profiler. 3040 JvmtiDynamicCodeEventCollector::~JvmtiDynamicCodeEventCollector() { 3041 assert(!JavaThread::current()->owns_locks(), "all locks must be released to post deferred events"); 3042 // iterate over any code blob descriptors that we collected 3043 if (_code_blobs != nullptr) { 3044 for (int i=0; i<_code_blobs->length(); i++) { 3045 JvmtiCodeBlobDesc* blob = _code_blobs->at(i); 3046 JvmtiExport::post_dynamic_code_generated(blob->name(), blob->code_begin(), blob->code_end()); 3047 FreeHeap(blob); 3048 } 3049 delete _code_blobs; 3050 } 3051 unset_jvmti_thread_state(); 3052 } 3053 3054 // register a stub 3055 void JvmtiDynamicCodeEventCollector::register_stub(const char* name, address start, address end) { 3056 if (_code_blobs == nullptr) { 3057 _code_blobs = new (mtServiceability) GrowableArray<JvmtiCodeBlobDesc*>(1, mtServiceability); 3058 } 3059 _code_blobs->append(new JvmtiCodeBlobDesc(name, start, end)); 3060 } 3061 3062 // Setup current thread to record vm allocated objects. 3063 JvmtiObjectAllocEventCollector::JvmtiObjectAllocEventCollector() : 3064 _allocated(nullptr), _enable(false), _post_callback(nullptr) { 3065 } 3066 3067 // Post vm_object_alloc event for vm allocated objects visible to java 3068 // world. 3069 void JvmtiObjectAllocEventCollector::generate_call_for_allocated() { 3070 if (_allocated) { 3071 set_enabled(false); 3072 for (int i = 0; i < _allocated->length(); i++) { 3073 oop obj = _allocated->at(i).resolve(); 3074 _post_callback(JavaThread::current(), obj); 3075 // Release OopHandle 3076 _allocated->at(i).release(JvmtiExport::jvmti_oop_storage()); 3077 3078 } 3079 delete _allocated, _allocated = nullptr; 3080 } 3081 } 3082 3083 void JvmtiObjectAllocEventCollector::record_allocation(oop obj) { 3084 assert(is_enabled(), "Object alloc event collector is not enabled"); 3085 if (_allocated == nullptr) { 3086 _allocated = new (mtServiceability) GrowableArray<OopHandle>(1, mtServiceability); 3087 } 3088 _allocated->push(OopHandle(JvmtiExport::jvmti_oop_storage(), obj)); 3089 } 3090 3091 // Disable collection of VMObjectAlloc events 3092 NoJvmtiVMObjectAllocMark::NoJvmtiVMObjectAllocMark() : _collector(nullptr) { 3093 // a no-op if VMObjectAlloc event is not enabled 3094 if (!JvmtiExport::should_post_vm_object_alloc()) { 3095 return; 3096 } 3097 Thread* thread = Thread::current_or_null(); 3098 if (thread != nullptr && thread->is_Java_thread()) { 3099 JavaThread* current_thread = JavaThread::cast(thread); 3100 JvmtiThreadState *state = current_thread->jvmti_thread_state(); 3101 if (state != nullptr) { 3102 JvmtiVMObjectAllocEventCollector *collector; 3103 collector = state->get_vm_object_alloc_event_collector(); 3104 if (collector != nullptr && collector->is_enabled()) { 3105 _collector = collector; 3106 _collector->set_enabled(false); 3107 } 3108 } 3109 } 3110 } 3111 3112 // Re-Enable collection of VMObjectAlloc events (if previously enabled) 3113 NoJvmtiVMObjectAllocMark::~NoJvmtiVMObjectAllocMark() { 3114 if (was_enabled()) { 3115 _collector->set_enabled(true); 3116 } 3117 }; 3118 3119 // Setup current thread to record vm allocated objects. 3120 JvmtiVMObjectAllocEventCollector::JvmtiVMObjectAllocEventCollector() { 3121 if (JvmtiExport::should_post_vm_object_alloc()) { 3122 _enable = true; 3123 setup_jvmti_thread_state(); 3124 _post_callback = JvmtiExport::post_vm_object_alloc; 3125 } 3126 } 3127 3128 JvmtiVMObjectAllocEventCollector::~JvmtiVMObjectAllocEventCollector() { 3129 if (_enable) { 3130 generate_call_for_allocated(); 3131 } 3132 unset_jvmti_thread_state(); 3133 } 3134 3135 bool JvmtiSampledObjectAllocEventCollector::object_alloc_is_safe_to_sample() { 3136 Thread* thread = Thread::current(); 3137 // Really only sample allocations if this is a JavaThread and not the compiler 3138 // thread. 3139 if (!thread->is_Java_thread() || thread->is_Compiler_thread()) { 3140 return false; 3141 } 3142 3143 // If the current thread is attaching from native and its Java thread object 3144 // is being allocated, things are not ready for allocation sampling. 3145 JavaThread* jt = JavaThread::cast(thread); 3146 if (jt->is_attaching_via_jni() && jt->threadObj() == nullptr) { 3147 return false; 3148 } 3149 3150 return true; 3151 } 3152 3153 // Setup current thread to record sampled allocated objects. 3154 void JvmtiSampledObjectAllocEventCollector::start() { 3155 if (JvmtiExport::should_post_sampled_object_alloc()) { 3156 if (!object_alloc_is_safe_to_sample()) { 3157 return; 3158 } 3159 3160 _enable = true; 3161 setup_jvmti_thread_state(); 3162 _post_callback = JvmtiExport::post_sampled_object_alloc; 3163 } 3164 } 3165 3166 JvmtiSampledObjectAllocEventCollector::~JvmtiSampledObjectAllocEventCollector() { 3167 if (!_enable) { 3168 return; 3169 } 3170 3171 generate_call_for_allocated(); 3172 unset_jvmti_thread_state(); 3173 3174 // Unset the sampling collector as present in assertion mode only. 3175 assert(Thread::current()->is_Java_thread(), 3176 "Should always be in a Java thread"); 3177 } 3178 3179 JvmtiGCMarker::JvmtiGCMarker() { 3180 // if there aren't any JVMTI environments then nothing to do 3181 if (!JvmtiEnv::environments_might_exist()) { 3182 return; 3183 } 3184 3185 if (JvmtiExport::should_post_garbage_collection_start()) { 3186 JvmtiExport::post_garbage_collection_start(); 3187 } 3188 3189 if (SafepointSynchronize::is_at_safepoint()) { 3190 // Do clean up tasks that need to be done at a safepoint 3191 JvmtiEnvBase::check_for_periodic_clean_up(); 3192 } 3193 } 3194 3195 JvmtiGCMarker::~JvmtiGCMarker() { 3196 // if there aren't any JVMTI environments then nothing to do 3197 if (!JvmtiEnv::environments_might_exist()) { 3198 return; 3199 } 3200 3201 // JVMTI notify gc finish 3202 if (JvmtiExport::should_post_garbage_collection_finish()) { 3203 JvmtiExport::post_garbage_collection_finish(); 3204 } 3205 }