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.
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.
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).
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.
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
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"
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; }
81
#define EVT_TRIG_TRACE(evt,out)
82
#define EVT_TRACE(evt,out)
85
///////////////////////////////////////////////////////////////
87
// JvmtiEventTransition
92
// Use this for JavaThreads and state is _thread_in_vm.
93
class JvmtiJavaThreadEventTransition : StackObj {
96
ThreadToNativeFromVM _transition;
100
JvmtiJavaThreadEventTransition(JavaThread *thread) :
106
// For JavaThreads which are not in _thread_in_vm state
107
// and other system threads use this.
108
class JvmtiThreadEventTransition : StackObj {
112
JavaThreadState _saved_state;
113
JavaThread *_jthread;
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);
123
ThreadStateTransition::transition_from_vm(_jthread, _thread_in_native);
130
~JvmtiThreadEventTransition() {
131
if (_jthread != nullptr)
132
ThreadStateTransition::transition_from_native(_jthread, _saved_state);
137
///////////////////////////////////////////////////////////////
142
class JvmtiEventMark : public StackObj {
146
JvmtiThreadState::ExceptionState _saved_exception_state;
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();
159
thread->push_jni_handle_block();
160
assert(thread == JavaThread::current(), "thread must be current!");
161
thread->frame_anchor()->make_walkable();
165
_thread->pop_jni_handle_block();
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);
175
jobject to_jobject(oop obj) { return JNIHandles::make_local(_thread,obj); }
177
jclass to_jclass(Klass* klass) { return (klass == nullptr ? nullptr : (jclass)to_jobject(klass->java_mirror())); }
179
jmethodID to_jmethodID(const methodHandle& method) { return method->jmethod_id(); }
181
JNIEnv* jni_env() { return _jni_env; }
184
class JvmtiThreadEventMark : public JvmtiEventMark {
189
JvmtiThreadEventMark(JavaThread *thread) :
190
JvmtiEventMark(thread) {
191
_jthread = to_jobject(thread->threadObj());
193
jthread jni_thread() { return (jthread)_jthread; }
196
class JvmtiVirtualThreadEventMark : public JvmtiEventMark {
201
JvmtiVirtualThreadEventMark(JavaThread *thread) :
202
JvmtiEventMark(thread) {
203
assert(thread->vthread() != nullptr || thread->threadObj() == nullptr, "sanity check");
204
_jthread = to_jobject(thread->vthread());
206
jthread jni_thread() { return (jthread)_jthread; }
209
class JvmtiClassEventMark : public JvmtiVirtualThreadEventMark {
214
JvmtiClassEventMark(JavaThread *thread, Klass* klass) :
215
JvmtiVirtualThreadEventMark(thread) {
216
_jc = to_jclass(klass);
218
jclass jni_class() { return _jc; }
221
class JvmtiMethodEventMark : public JvmtiVirtualThreadEventMark {
226
JvmtiMethodEventMark(JavaThread *thread, const methodHandle& method) :
227
JvmtiVirtualThreadEventMark(thread),
228
_mid(to_jmethodID(method)) {};
229
jmethodID jni_methodID() { return _mid; }
232
class JvmtiLocationEventMark : public JvmtiMethodEventMark {
237
JvmtiLocationEventMark(JavaThread *thread, const methodHandle& method, address location) :
238
JvmtiMethodEventMark(thread, method),
239
_loc(location - method->code_base()) {};
240
jlocation location() { return _loc; }
243
class JvmtiExceptionEventMark : public JvmtiLocationEventMark {
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; }
254
class JvmtiClassFileLoadEventMark : public JvmtiThreadEventMark {
256
const char *_class_name;
258
jobject _protection_domain;
259
jclass _class_being_redefined;
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;
270
_class_being_redefined = (jclass)to_jclass(class_being_redefined);
273
const char *class_name() {
279
jobject protection_domain() {
280
return _protection_domain;
282
jclass class_being_redefined() {
283
return _class_being_redefined;
287
//////////////////////////////////////////////////////////////////////////////
289
int JvmtiExport::_field_access_count = 0;
290
int JvmtiExport::_field_modification_count = 0;
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;
297
uint64_t JvmtiExport::_redefinition_count = 0;
298
bool JvmtiExport::_all_dependencies_are_recorded = false;
301
// field access management
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
313
// Other access/mutation safe by virtue of being in VM state.
314
return (address)(&_field_access_count);
318
// field modification management
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);
335
///////////////////////////////////////////////////////////////
336
// Functions needed by java.lang.instrument for starting up javaagent.
337
///////////////////////////////////////////////////////////////
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;
345
// micro version doesn't matter here (yet?)
346
decode_version_values(version, &major, &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
356
return JNI_EVERSION; // unsupported minor version number
361
case 0: // version 9.0.<micro> is recognized
364
return JNI_EVERSION; // unsupported minor version number
369
case 0: // version 11.0.<micro> is recognized
372
return JNI_EVERSION; // unsupported minor version number
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
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;)
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*
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();
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*
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);
415
// Called at the wrong time
417
return JNI_EDETACHED;
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);
427
return thread->jvmti_thread_state();
431
JvmtiExport::add_default_read_edges(Handle h_module, TRAPS) {
432
if (!Universe::is_module_initialized()) {
433
return; // extra safety
435
assert(!h_module.is_null(), "module should always be set");
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(),
446
if (HAS_PENDING_EXCEPTION) {
447
LogTarget(Trace, jvmti) log;
448
LogStream log_stream(log);
449
java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
451
CLEAR_PENDING_EXCEPTION;
457
JvmtiExport::add_module_reads(Handle module, Handle to_module, TRAPS) {
458
if (!Universe::is_module_initialized()) {
459
return JVMTI_ERROR_NONE; // extra safety
461
assert(!module.is_null(), "module should always be set");
462
assert(!to_module.is_null(), "to_module should always be set");
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(),
474
if (HAS_PENDING_EXCEPTION) {
475
LogTarget(Trace, jvmti) log;
476
LogStream log_stream(log);
477
java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
479
CLEAR_PENDING_EXCEPTION;
480
return JVMTI_ERROR_INTERNAL;
482
return JVMTI_ERROR_NONE;
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
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");
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(),
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);
511
CLEAR_PENDING_EXCEPTION;
512
if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) {
513
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
515
return JVMTI_ERROR_INTERNAL;
517
return JVMTI_ERROR_NONE;
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
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");
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(),
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);
546
CLEAR_PENDING_EXCEPTION;
547
if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) {
548
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
550
return JVMTI_ERROR_INTERNAL;
552
return JVMTI_ERROR_NONE;
556
JvmtiExport::add_module_uses(Handle module, Handle service, TRAPS) {
557
if (!Universe::is_module_initialized()) {
558
return JVMTI_ERROR_NONE; // extra safety
560
assert(!module.is_null(), "module should always be set");
561
assert(!service.is_null(), "service should always be set");
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(),
573
if (HAS_PENDING_EXCEPTION) {
574
LogTarget(Trace, jvmti) log;
575
LogStream log_stream(log);
576
java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
578
CLEAR_PENDING_EXCEPTION;
579
return JVMTI_ERROR_INTERNAL;
581
return JVMTI_ERROR_NONE;
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
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");
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(),
604
if (HAS_PENDING_EXCEPTION) {
605
LogTarget(Trace, jvmti) log;
606
LogStream log_stream(log);
607
java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
609
CLEAR_PENDING_EXCEPTION;
610
return JVMTI_ERROR_INTERNAL;
612
return JVMTI_ERROR_NONE;
616
JvmtiExport::decode_version_values(jint version, int * major, int * minor,
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;
623
void JvmtiExport::enter_primordial_phase() {
624
JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL);
627
void JvmtiExport::enter_early_start_phase() {
628
set_early_vmstart_recorded(true);
631
void JvmtiExport::enter_start_phase() {
632
JvmtiEnvBase::set_phase(JVMTI_PHASE_START);
635
void JvmtiExport::enter_onload_phase() {
636
JvmtiEnvBase::set_phase(JVMTI_PHASE_ONLOAD);
639
void JvmtiExport::enter_live_phase() {
640
JvmtiEnvBase::set_phase(JVMTI_PHASE_LIVE);
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.
648
void JvmtiExport::post_early_vm_start() {
649
EVT_TRIG_TRACE(JVMTI_EVENT_VM_START, ("Trg Early VM start event triggered" ));
651
// can now enable some events
652
JvmtiEventController::vm_start();
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());
670
void JvmtiExport::post_vm_start() {
671
EVT_TRIG_TRACE(JVMTI_EVENT_VM_START, ("Trg VM start event triggered" ));
673
// can now enable some events
674
JvmtiEventController::vm_start();
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" ));
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());
693
static OopStorage* _jvmti_oop_storage = nullptr;
694
static OopStorage* _weak_tag_storage = nullptr;
696
OopStorage* JvmtiExport::jvmti_oop_storage() {
697
assert(_jvmti_oop_storage != nullptr, "not yet initialized");
698
return _jvmti_oop_storage;
701
OopStorage* JvmtiExport::weak_tag_storage() {
702
assert(_weak_tag_storage != nullptr, "not yet initialized");
703
return _weak_tag_storage;
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);
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;
721
void JvmtiExport::post_vm_initialized() {
722
EVT_TRIG_TRACE(JVMTI_EVENT_VM_INIT, ("Trg VM init event triggered" ));
724
// can now enable events
725
JvmtiEventController::vm_init();
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" ));
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();
743
(*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread());
744
if (agent != nullptr) {
745
agent->initialization_end();
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();
757
void JvmtiExport::post_vm_death() {
758
EVT_TRIG_TRACE(JVMTI_EVENT_VM_DEATH, ("Trg VM death event triggered" ));
760
JvmtiTagMap::flush_all_object_free_events();
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" ));
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());
777
JvmtiEnvBase::set_phase(JVMTI_PHASE_DEAD);
778
JvmtiEventController::vm_death();
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);
788
MutexLocker mu(JvmtiThreadState_lock);
789
return JvmtiEnvBase::get_all_native_method_prefixes(count_ptr);
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 *.
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.
803
JvmtiExport::cv_external_thread_to_JavaThread(ThreadsList * t_list,
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()
811
if (thread_oop_p != nullptr) {
812
*thread_oop_p = nullptr;
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;
820
// Looks like an oop at this point.
822
if (!thread_oop->is_a(vmClasses::Thread_klass())) {
823
// The oop is not a java.lang.Thread.
824
return JVMTI_ERROR_INVALID_THREAD;
826
// Looks like a java.lang.Thread oop at this point.
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;
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;
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;
843
// Looks like a live JavaThread at this point.
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;
850
// Return a live JavaThread that is "protected" by the
851
// ThreadsListHandle in the caller.
852
*jt_pp = java_thread;
854
return JVMTI_ERROR_NONE;
857
// Convert an oop to a JavaThread found on the specified ThreadsList.
858
// The ThreadsListHandle in the caller "protects" the returned
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.
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");
872
if (!thread_oop->is_a(vmClasses::Thread_klass())) {
873
// The oop is not a java.lang.Thread.
874
return JVMTI_ERROR_INVALID_THREAD;
876
// Looks like a java.lang.Thread oop at this point.
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;
884
// Looks like a live JavaThread at this point.
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;
891
// Return a live JavaThread that is "protected" by the
892
// ThreadsListHandle in the caller.
893
*jt_pp = java_thread;
895
return JVMTI_ERROR_NONE;
898
class JvmtiClassFileLoadHookPoster : public StackObj {
901
Handle _class_loader;
902
Handle _h_protection_domain;
903
unsigned char ** _data_ptr;
904
unsigned char ** _end_ptr;
905
JavaThread * _thread;
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;
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) {
921
_class_loader = class_loader;
922
_h_protection_domain = h_protection_domain;
923
_data_ptr = data_ptr;
925
_thread = JavaThread::current();
926
_curr_len = pointer_delta_as_int(*end_ptr, *data_ptr);
927
_curr_data = *data_ptr;
929
_cached_class_file_ptr = cache_ptr;
930
_has_been_modified = false;
932
if (_thread->is_in_any_VTMS_transition()) {
933
return; // no events should be posted if thread is in any VTMS transition
935
_state = JvmtiExport::get_jvmti_thread_state(_thread);
936
if (_state != nullptr) {
937
_class_being_redefined = _state->get_class_being_redefined();
938
_load_kind = _state->get_class_load_kind();
939
Klass* klass = (_class_being_redefined == nullptr) ? nullptr : _class_being_redefined;
940
if (_load_kind != jvmti_class_load_kind_load && klass != nullptr) {
941
ModuleEntry* module_entry = InstanceKlass::cast(klass)->module();
942
assert(module_entry != nullptr, "module_entry should always be set");
943
if (module_entry->is_named() &&
944
module_entry->module() != nullptr &&
945
!module_entry->has_default_read_edges()) {
946
if (!module_entry->set_has_default_read_edges()) {
947
// We won a potential race.
948
// Add read edges to the unnamed modules of the bootstrap and app class loaders
949
Handle class_module(_thread, module_entry->module()); // Obtain j.l.r.Module
950
JvmtiExport::add_default_read_edges(class_module, _thread);
954
// Clear class_being_redefined flag here. The action
955
// from agent handler could generate a new class file load
956
// hook event and if it is not cleared the new event generated
957
// from regular class file load could have this stale redefined
958
// class handle info.
959
_state->clear_class_being_redefined();
961
// redefine and retransform will always set the thread state
962
_class_being_redefined = nullptr;
963
_load_kind = jvmti_class_load_kind_load;
969
copy_modified_data();
972
bool has_been_modified() { return _has_been_modified; }
975
void post_all_envs() {
976
if (_load_kind != jvmti_class_load_kind_retransform) {
977
// for class load and redefine,
978
// call the non-retransformable agents
980
for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) {
981
if (!env->is_retransformable() && env->is_enabled(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK)) {
982
// non-retransformable agents cannot retransform back,
983
// so no need to cache the original class file bytes
984
post_to_env(env, false);
989
for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) {
990
// retransformable agents get all events
991
if (env->is_retransformable() && env->is_enabled(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK)) {
992
// retransformable agents need to cache the original class file
993
// bytes if changes are made via the ClassFileLoadHook
994
post_to_env(env, true);
999
void post_to_env(JvmtiEnv* env, bool caching_needed) {
1000
if (env->phase() == JVMTI_PHASE_PRIMORDIAL && !env->early_class_hook_env()) {
1003
unsigned char *new_data = nullptr;
1005
JvmtiClassFileLoadEventMark jem(_thread, _h_name, _class_loader,
1006
_h_protection_domain,
1007
_class_being_redefined);
1008
JvmtiJavaThreadEventTransition jet(_thread);
1009
jvmtiEventClassFileLoadHook callback = env->callbacks()->ClassFileLoadHook;
1010
if (callback != nullptr) {
1011
(*callback)(env->jvmti_external(), jem.jni_env(),
1012
jem.class_being_redefined(),
1013
jem.jloader(), jem.class_name(),
1014
jem.protection_domain(),
1015
_curr_len, _curr_data,
1016
&new_len, &new_data);
1018
if (new_data != nullptr) {
1019
// this agent has modified class data.
1020
_has_been_modified = true;
1021
if (caching_needed && *_cached_class_file_ptr == nullptr) {
1022
// data has been changed by the new retransformable agent
1023
// and it hasn't already been cached, cache it
1024
JvmtiCachedClassFileData *p;
1025
p = (JvmtiCachedClassFileData *)os::malloc(
1026
offset_of(JvmtiCachedClassFileData, data) + _curr_len, mtInternal);
1028
vm_exit_out_of_memory(offset_of(JvmtiCachedClassFileData, data) + _curr_len,
1030
"unable to allocate cached copy of original class bytes");
1032
p->length = _curr_len;
1033
memcpy(p->data, _curr_data, _curr_len);
1034
*_cached_class_file_ptr = p;
1037
if (_curr_data != *_data_ptr) {
1038
// curr_data is previous agent modified class data.
1039
// And this has been changed by the new agent so
1040
// we can delete it now.
1041
_curr_env->Deallocate(_curr_data);
1044
// Class file data has changed by the current agent.
1045
_curr_data = new_data;
1046
_curr_len = new_len;
1047
// Save the current agent env we need this to deallocate the
1048
// memory allocated by this agent.
1053
void copy_modified_data() {
1054
// if one of the agent has modified class file data.
1055
// Copy modified class data to new resources array.
1056
if (_curr_data != *_data_ptr) {
1057
*_data_ptr = NEW_RESOURCE_ARRAY(u1, _curr_len);
1058
memcpy(*_data_ptr, _curr_data, _curr_len);
1059
*_end_ptr = *_data_ptr + _curr_len;
1060
_curr_env->Deallocate(_curr_data);
1065
bool JvmtiExport::is_early_phase() {
1066
return JvmtiEnvBase::get_phase() <= JVMTI_PHASE_PRIMORDIAL;
1069
bool JvmtiExport::has_early_class_hook_env() {
1070
JvmtiEnvIterator it;
1071
for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) {
1072
if (env->early_class_hook_env()) {
1079
bool JvmtiExport::_should_post_class_file_load_hook = false;
1081
// This flag is read by C2 during VM internal objects allocation
1082
int JvmtiExport::_should_notify_object_alloc = 0;
1084
// this entry is for class file load hook on class load, redefine and retransform
1085
bool JvmtiExport::post_class_file_load_hook(Symbol* h_name,
1086
Handle class_loader,
1087
Handle h_protection_domain,
1088
unsigned char **data_ptr,
1089
unsigned char **end_ptr,
1090
JvmtiCachedClassFileData **cache_ptr) {
1091
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1094
if (JavaThread::current()->is_in_tmp_VTMS_transition()) {
1095
return false; // skip CFLH events in tmp VTMS transition
1098
JvmtiClassFileLoadHookPoster poster(h_name, class_loader,
1099
h_protection_domain,
1103
return poster.has_been_modified();
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.
1110
vm_exit_during_initialization("Java Kernel does not support JVMTI.");
1115
static inline Klass* oop_to_klass(oop obj) {
1116
Klass* k = obj->klass();
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");
1128
class JvmtiObjectAllocEventMark : public JvmtiClassEventMark {
1133
JvmtiObjectAllocEventMark(JavaThread *thread, oop obj) : JvmtiClassEventMark(thread, oop_to_klass(obj)) {
1134
_jobj = (jobject)to_jobject(obj);
1135
_size = obj->size() * wordSize;
1137
jobject jni_jobject() { return _jobj; }
1138
jlong size() { return _size; }
1141
class JvmtiCompiledMethodLoadEventMark : public JvmtiMethodEventMark {
1144
const void *_code_data;
1146
jvmtiAddrLocationMap *_map;
1147
const void *_compile_info;
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);
1156
~JvmtiCompiledMethodLoadEventMark() {
1157
FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map);
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; }
1169
class JvmtiMonitorEventMark : public JvmtiVirtualThreadEventMark {
1173
JvmtiMonitorEventMark(JavaThread *thread, oop object)
1174
: JvmtiVirtualThreadEventMark(thread){
1175
_jobj = to_jobject(object);
1177
jobject jni_object() { return _jobj; }
1180
///////////////////////////////////////////////////////////////
1182
// pending CompiledMethodUnload support
1185
void JvmtiExport::post_compiled_method_unload(
1186
jmethodID method, const void *code_begin) {
1187
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
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)));
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) {
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)));
1206
ResourceMark rm(thread);
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);
1218
///////////////////////////////////////////////////////////////
1223
void JvmtiExport::post_raw_breakpoint(JavaThread *thread, Method* method, address location) {
1224
HandleMark hm(thread);
1225
methodHandle mh(thread, method);
1227
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1228
if (state == nullptr) {
1231
if (thread->is_in_any_VTMS_transition()) {
1232
return; // no events should be posted if thread is in any VTMS transition
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() ));
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());
1258
ets->set_breakpoint_posted();
1259
thread->osthread()->set_state(old_os_state);
1264
//////////////////////////////////////////////////////////////////////////////
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;
1281
bool JvmtiExport::_early_vmstart_recorded = false;
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;
1312
////////////////////////////////////////////////////////////////////////////////////////////////
1316
// JVMTI single step management
1318
void JvmtiExport::at_single_stepping_point(JavaThread *thread, Method* method, address location) {
1319
assert(JvmtiExport::should_post_single_step(), "must be single stepping");
1321
HandleMark hm(thread);
1322
methodHandle mh(thread, method);
1324
// update information about current location and post a step event
1325
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1326
if (state == nullptr) {
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();
1335
if (state->is_pending_step_for_earlyret()) {
1336
state->process_pending_step_for_earlyret();
1338
JvmtiExport::post_single_step(thread, mh(), location);
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();
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();
1361
void JvmtiExport::post_class_load(JavaThread *thread, Klass* klass) {
1362
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1365
HandleMark hm(thread);
1367
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1368
if (state == nullptr) {
1371
if (thread->is_in_any_VTMS_transition()) {
1372
return; // no events should be posted if thread is in any VTMS transition
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) {
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());
1398
void JvmtiExport::post_class_prepare(JavaThread *thread, Klass* klass) {
1399
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1402
HandleMark hm(thread);
1404
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1405
if (state == nullptr) {
1408
if (thread->is_in_any_VTMS_transition()) {
1409
return; // no events should be posted if thread is in any VTMS transition
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) {
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());
1434
void JvmtiExport::post_class_unload(Klass* klass) {
1435
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1439
// postings to the service thread so that it can perform them in a safe
1440
// context and in-order.
1442
// JvmtiDeferredEvent copies the string.
1443
JvmtiDeferredEvent event = JvmtiDeferredEvent::class_unload_event(klass->name()->as_C_string());
1444
ServiceThread::enqueue_deferred_event(&event);
1448
void JvmtiExport::post_class_unload_internal(const char* name) {
1449
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1452
assert(Thread::current()->is_service_thread(), "must be called from ServiceThread");
1453
JavaThread *thread = JavaThread::current();
1454
HandleMark hm(thread);
1456
EVT_TRIG_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Trg Class Unload triggered" ));
1457
if (JvmtiEventController::is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
1459
JvmtiEnvIterator it;
1460
for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) {
1461
if (env->phase() == JVMTI_PHASE_PRIMORDIAL) {
1464
if (env->is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
1465
EVT_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Evt Class Unload sent %s", name));
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);
1479
void JvmtiExport::post_thread_start(JavaThread *thread) {
1480
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1483
assert(thread->thread_state() == _thread_in_vm, "must be in vm state");
1485
EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_START, ("[%s] Trg Thread Start event triggered",
1486
JvmtiTrace::safe_get_thread_name(thread)));
1488
// do JVMTI thread initialization (if needed)
1489
JvmtiEventController::thread_started(thread);
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());
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) {
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) ));
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());
1525
void JvmtiExport::post_thread_end(JavaThread *thread) {
1526
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1529
EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_END, ("[%s] Trg Thread End event triggered",
1530
JvmtiTrace::safe_get_thread_name(thread)));
1532
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1533
if (state == nullptr) {
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());
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()) {
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) {
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) ));
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());
1573
void JvmtiExport::post_vthread_start(jobject vthread) {
1574
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1577
EVT_TRIG_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_START, ("[%p] Trg Virtual Thread Start event triggered", vthread));
1579
JavaThread *thread = JavaThread::current();
1580
assert(!thread->is_hidden_from_external_view(), "carrier threads can't be hidden");
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) {
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));
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());
1602
void JvmtiExport::post_vthread_end(jobject vthread) {
1603
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1606
EVT_TRIG_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_END, ("[%p] Trg Virtual Thread End event triggered", vthread));
1608
JavaThread *thread = JavaThread::current();
1609
assert(!thread->is_hidden_from_external_view(), "carrier threads can't be hidden");
1611
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1612
if (state == nullptr) {
1616
if (state->is_enabled(JVMTI_EVENT_VIRTUAL_THREAD_END)) {
1617
JvmtiEnvThreadStateIterator it(state);
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) {
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));
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);
1638
void JvmtiExport::post_vthread_mount(jobject vthread) {
1639
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
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));
1646
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1647
if (state == nullptr) {
1651
if (state->is_enabled((jvmtiEvent)EXT_EVENT_VIRTUAL_THREAD_MOUNT)) {
1652
JvmtiEnvThreadStateIterator it(state);
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) {
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));
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());
1673
void JvmtiExport::post_vthread_unmount(jobject vthread) {
1674
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
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));
1681
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1682
if (state == nullptr) {
1686
if (state->is_enabled((jvmtiEvent)EXT_EVENT_VIRTUAL_THREAD_UNMOUNT)) {
1687
JvmtiEnvThreadStateIterator it(state);
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) {
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));
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());
1708
void JvmtiExport::continuation_yield_cleanup(JavaThread* thread, jint continuation_frame_count) {
1709
if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) {
1713
assert(thread == JavaThread::current(), "must be");
1714
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1715
if (state == nullptr) {
1718
state->invalidate_cur_stack_depth();
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;
1725
for (JvmtiEnvThreadState* ets = it.first(); ets != nullptr; ets = it.next(ets)) {
1726
if (!ets->has_frame_pops()) {
1729
for (int frame_idx = 0; frame_idx < continuation_frame_count; frame_idx++) {
1730
int frame_num = top_frame_num - frame_idx;
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);
1742
void JvmtiExport::post_object_free(JvmtiEnv* env, GrowableArray<jlong>* objects) {
1743
assert(objects != nullptr, "Nothing to post");
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
1749
if (!env->is_enabled(JVMTI_EVENT_OBJECT_FREE)) {
1750
return; // the event type has been already disabled
1753
EVT_TRIG_TRACE(JVMTI_EVENT_OBJECT_FREE, ("[?] Trg Object Free triggered" ));
1754
EVT_TRACE(JVMTI_EVENT_OBJECT_FREE, ("[?] Evt Object Free sent"));
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));
1766
void JvmtiExport::post_resource_exhausted(jint resource_exhausted_flags, const char* description) {
1768
JavaThread *thread = JavaThread::current();
1770
if (thread->is_in_any_VTMS_transition()) {
1771
return; // no events should be posted if thread is in any VTMS transition
1774
log_error(jvmti)("Posting Resource Exhausted event: %s",
1775
description != nullptr ? description : "unknown");
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()) {
1786
EVT_TRIG_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("Trg resource exhausted event triggered" ));
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" ));
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);
1804
void JvmtiExport::post_method_entry(JavaThread *thread, Method* method, frame current_frame) {
1805
HandleMark hm(thread);
1806
methodHandle mh(thread, method);
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
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
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() ));
1821
state->incr_cur_stack_depth();
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() ));
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());
1844
void JvmtiExport::post_method_exit(JavaThread* thread, Method* method, frame current_frame) {
1845
HandleMark hm(thread);
1846
methodHandle mh(thread, method);
1848
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1850
if (state == nullptr || !state->is_interp_only_mode()) {
1851
// for any thread that actually wants method exit, interp_only_mode is set
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();
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) {
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());
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
1882
post_method_exit_inner(thread, mh, state, exception_exit, current_frame, value);
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();
1891
void JvmtiExport::post_method_exit_inner(JavaThread* thread,
1893
JvmtiThreadState *state,
1894
bool exception_exit,
1895
frame current_frame,
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
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() ));
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() ));
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);
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();
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() ));
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);
1951
// remove the frame's entry
1953
MutexLocker mu(JvmtiThreadState_lock);
1954
ets->clear_frame_pop(cur_frame_number);
1960
state->decr_cur_stack_depth();
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);
1969
JvmtiThreadState *state = get_jvmti_thread_state(thread);
1970
if (state == nullptr) {
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
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() ));
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());
1996
ets->set_single_stepping_posted();
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);
2011
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2012
if (state == nullptr) {
2015
if (thread->is_in_any_VTMS_transition()) {
2016
return; // no events should be posted if thread is in any VTMS transition
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)) {
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() ));
2034
JvmtiEnv *env = ets->get_env();
2035
JvmtiExceptionEventMark jem(thread, mh, location, exception_handle);
2037
// It's okay to clear these exceptions here because we duplicate
2038
// this lookup in InterpreterRuntime::exception_handler_for_exception.
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
2049
methodHandle current_mh = methodHandle(thread, current_method);
2050
int current_bci = -1;
2052
current_method = st.method();
2053
current_mh = methodHandle(thread, current_method);
2054
current_bci = st.bci();
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;
2065
} while (should_repeat && (current_bci != -1));
2067
} while ((current_bci < 0) && (!st.at_end()));
2069
jmethodID catch_jmethodID;
2070
if (current_bci < 0) {
2071
catch_jmethodID = 0;
2074
catch_jmethodID = jem.to_jmethodID(current_mh);
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(),
2083
catch_jmethodID, current_bci);
2089
// frames may get popped because of this throw, be safe - invalidate cached depth
2090
state->invalidate_cur_stack_depth();
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);
2099
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2100
if (state == nullptr) {
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==0? "no location:" : "",
2109
location==0? 0 : location - mh()->code_base(),
2110
in_handler_frame? "in handler frame" : "not handler frame" ));
2112
if (state->is_exception_detected()) {
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.
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
2127
state->invalidate_cur_stack_depth();
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();
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
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() ));
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(),
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);
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");
2183
if (thread->is_in_any_VTMS_transition()) {
2184
return; // no events should be posted if thread is in any VTMS transition
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;
2196
HandleMark hm(thread);
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);
2203
post_field_access(thread,
2204
thread->last_frame().interpreter_frame_method(),
2205
thread->last_frame().interpreter_frame_bcp(),
2206
klass, h_obj, fieldID);
2209
void JvmtiExport::post_field_access(JavaThread *thread, Method* method,
2210
address location, Klass* field_klass, Handle object, jfieldID field) {
2212
HandleMark hm(thread);
2213
methodHandle mh(thread, method);
2215
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2216
if (state == nullptr) {
2219
if (thread->is_in_any_VTMS_transition()) {
2220
return; // no events should be posted if thread is in any VTMS transition
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() ));
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);
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);
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");
2269
if (thread->is_in_any_VTMS_transition()) {
2270
return; // no events should be posted if thread is in any VTMS transition
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;
2282
HandleMark hm(thread);
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);
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);
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) {
2300
if (thread->is_in_any_VTMS_transition()) {
2301
return; // no events should be posted if thread is in any VTMS transition
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
2310
bool found = JvmtiEnv::get_field_descriptor(field_klass, field, &fd);
2311
// should be found (if not, leave as is)
2313
jint ival = value->i;
2314
// convert value from int to appropriate type
2315
switch (fd.field_type()) {
2317
sig_type = JVM_SIGNATURE_BOOLEAN;
2318
value->i = 0; // clear it
2319
value->z = (jboolean)ival;
2322
sig_type = JVM_SIGNATURE_BYTE;
2323
value->i = 0; // clear it
2324
value->b = (jbyte)ival;
2327
sig_type = JVM_SIGNATURE_CHAR;
2328
value->i = 0; // clear it
2329
value->c = (jchar)ival;
2332
sig_type = JVM_SIGNATURE_SHORT;
2333
value->i = 0; // clear it
2334
value->s = (jshort)ival;
2340
// this is an integer instruction, should be one of above
2341
ShouldNotReachHere();
2347
assert(sig_type != JVM_SIGNATURE_ARRAY, "array should have sig_type == 'L'");
2348
bool handle_created = false;
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));
2356
post_field_modification(thread, method, location, field_klass, object, field, sig_type, value);
2358
// Destroy the JNI handle allocated above.
2359
if (handle_created) {
2360
JNIHandles::destroy_local(value->l);
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) {
2368
HandleMark hm(thread);
2369
methodHandle mh(thread, method);
2371
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2372
if (state == nullptr) {
2375
if (thread->is_in_any_VTMS_transition()) {
2376
return; // no events should be posted if thread is in any VTMS transition
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() ));
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);
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");
2411
HandleMark hm(thread);
2412
methodHandle mh(thread, method);
2414
if (thread->is_in_any_VTMS_transition()) {
2415
return; // no events should be posted if thread is in any VTMS transition
2417
EVT_TRIG_TRACE(JVMTI_EVENT_NATIVE_METHOD_BIND, ("[%s] Trg Native Method Bind event triggered",
2418
JvmtiTrace::safe_get_thread_name(thread)));
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) ));
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);
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;
2449
for(PcDesc* p = nm->scopes_pcs_begin(); p < nm->scopes_pcs_end(); p++) {
2450
if(p->scope_decode_offset() == DebugInformationRecorder::serialized_null) continue;
2453
record->pcinfo = (PCStackInfo*)(NEW_RESOURCE_ARRAY(PCStackInfo, record->numpcs));
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;
2461
for(ScopeDesc* sd = nm->scope_desc_at(p->real_pc(nm));sd != nullptr;sd = sd->sender()) {
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;
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();
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) {
2486
JavaThread* thread = JavaThread::current();
2488
assert(!thread->is_in_any_VTMS_transition(), "compiled method load events are not allowed in any VTMS transition");
2490
EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
2491
("[%s] method compile load event triggered",
2492
JvmtiTrace::safe_get_thread_name(thread)));
2494
JvmtiEnvIterator it;
2495
for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) {
2496
post_compiled_method_load(env, nm);
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)) {
2505
jvmtiEventCompiledMethodLoad callback = env->callbacks()->CompiledMethodLoad;
2506
if (callback == nullptr) {
2509
JavaThread* thread = JavaThread::current();
2511
assert(!thread->is_in_any_VTMS_transition(), "compiled method load events are not allowed in any VTMS transition");
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);
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());
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");
2534
JavaThread* thread = JavaThread::current();
2536
assert(!thread->is_in_any_VTMS_transition(), "dynamic code generated events are not allowed in any VTMS transition");
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;
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);
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);
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);
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)
2582
JavaThread* thread = JavaThread::current();
2584
assert(!thread->is_in_any_VTMS_transition(), "dynamic code generated events are not allowed in any VTMS transition");
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);
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)
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);
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
2638
if (obj->klass() != vmClasses::Class_klass()) {
2639
collector->record_allocation(obj);
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();
2660
if (collector != nullptr && collector->is_enabled()) {
2661
collector->record_allocation(obj);
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());
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());
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());
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);
2735
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2736
if (state == nullptr) {
2739
if (thread->is_in_any_VTMS_transition()) {
2740
return; // no events should be posted if thread is in any VTMS transition
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());
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);
2768
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2769
if (state == nullptr) {
2772
if (thread->is_in_any_VTMS_transition()) {
2773
return; // no events should be posted if thread is in any VTMS transition
2776
EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED,
2777
("[%s] monitor contended entered event triggered",
2778
JvmtiTrace::safe_get_thread_name(thread)));
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());
2797
void JvmtiExport::post_monitor_wait(JavaThread *thread, oop object,
2799
HandleMark hm(thread);
2800
Handle h(thread, object);
2802
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2803
if (state == nullptr) {
2806
if (thread->is_in_any_VTMS_transition()) {
2807
return; // no events should be posted if thread is in any VTMS transition
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);
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);
2836
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2837
if (state == nullptr) {
2840
if (thread->is_in_any_VTMS_transition()) {
2841
return; // no events should be posted if thread is in any VTMS transition
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);
2865
void JvmtiExport::post_vm_object_alloc(JavaThread *thread, oop object) {
2866
if (object == nullptr) {
2869
if (thread->is_in_any_VTMS_transition()) {
2870
return; // no events should be posted if thread is in any VTMS transition
2872
HandleMark hm(thread);
2873
Handle h(thread, object);
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()));
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());
2895
void JvmtiExport::post_sampled_object_alloc(JavaThread *thread, oop object) {
2896
HandleMark hm(thread);
2897
Handle h(thread, object);
2899
JvmtiThreadState *state = get_jvmti_thread_state(thread);
2900
if (state == nullptr) {
2903
if (object == nullptr) {
2906
if (thread->is_in_any_VTMS_transition()) {
2907
return; // no events should be posted if thread is in any VTMS transition
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()));
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());
2933
////////////////////////////////////////////////////////////////////////////////////////////////
2935
void JvmtiExport::cleanup_thread(JavaThread* thread) {
2936
assert(JavaThread::current() == thread, "thread is not current");
2937
MutexLocker mu(thread, JvmtiThreadState_lock);
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);
2947
void JvmtiExport::clear_detected_exception(JavaThread* thread) {
2948
assert(JavaThread::current() == thread, "thread is not current");
2950
JvmtiThreadState* state = thread->jvmti_thread_state();
2951
if (state != nullptr) {
2952
state->clear_exception_state();
2956
// Onload raw monitor transition.
2957
void JvmtiExport::transition_pending_onload_raw_monitors() {
2958
JvmtiPendingMonitors::transition_raw_monitors();
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();
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()) {
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();
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.
2990
state->set_sampled_object_alloc_event_collector((JvmtiSampledObjectAllocEventCollector*) this);
2993
_unset_jvmti_thread_state = true;
2996
// Unset current event collection in this thread and reset it with previous
2998
void JvmtiEventCollector::unset_jvmti_thread_state() {
2999
if (!_unset_jvmti_thread_state) {
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);
3010
// this thread's jvmti state was created during the scope of
3011
// the event collector.
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);
3017
// this thread's jvmti state was created during the scope of
3018
// the event collector.
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);
3024
// this thread's jvmti state was created during the scope of
3025
// the event collector.
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();
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());
3051
unset_jvmti_thread_state();
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);
3059
_code_blobs->append(new JvmtiCodeBlobDesc(name, start, end));
3062
// Setup current thread to record vm allocated objects.
3063
JvmtiObjectAllocEventCollector::JvmtiObjectAllocEventCollector() :
3064
_allocated(nullptr), _enable(false), _post_callback(nullptr) {
3067
// Post vm_object_alloc event for vm allocated objects visible to java
3069
void JvmtiObjectAllocEventCollector::generate_call_for_allocated() {
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());
3079
delete _allocated, _allocated = nullptr;
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);
3088
_allocated->push(OopHandle(JvmtiExport::jvmti_oop_storage(), obj));
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()) {
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);
3112
// Re-Enable collection of VMObjectAlloc events (if previously enabled)
3113
NoJvmtiVMObjectAllocMark::~NoJvmtiVMObjectAllocMark() {
3114
if (was_enabled()) {
3115
_collector->set_enabled(true);
3119
// Setup current thread to record vm allocated objects.
3120
JvmtiVMObjectAllocEventCollector::JvmtiVMObjectAllocEventCollector() {
3121
if (JvmtiExport::should_post_vm_object_alloc()) {
3123
setup_jvmti_thread_state();
3124
_post_callback = JvmtiExport::post_vm_object_alloc;
3128
JvmtiVMObjectAllocEventCollector::~JvmtiVMObjectAllocEventCollector() {
3130
generate_call_for_allocated();
3132
unset_jvmti_thread_state();
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
3139
if (!thread->is_Java_thread() || thread->is_Compiler_thread()) {
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) {
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()) {
3161
setup_jvmti_thread_state();
3162
_post_callback = JvmtiExport::post_sampled_object_alloc;
3166
JvmtiSampledObjectAllocEventCollector::~JvmtiSampledObjectAllocEventCollector() {
3171
generate_call_for_allocated();
3172
unset_jvmti_thread_state();
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");
3179
JvmtiGCMarker::JvmtiGCMarker() {
3180
// if there aren't any JVMTI environments then nothing to do
3181
if (!JvmtiEnv::environments_might_exist()) {
3185
if (JvmtiExport::should_post_garbage_collection_start()) {
3186
JvmtiExport::post_garbage_collection_start();
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();
3195
JvmtiGCMarker::~JvmtiGCMarker() {
3196
// if there aren't any JVMTI environments then nothing to do
3197
if (!JvmtiEnv::environments_might_exist()) {
3201
// JVMTI notify gc finish
3202
if (JvmtiExport::should_post_garbage_collection_finish()) {
3203
JvmtiExport::post_garbage_collection_finish();