SetEventCallbacks() と SetEventNotificationMode() によって SingleStep event が有効化されると, VM_ChangeSingleStep::doit() により SingleStep モードが始まる.
その後, SetEventCallbacks() か SetEventNotificationMode() によって SingleStep event が disabled にされると, VM_ChangeSingleStep::doit() により SingleStep モードが終了する.
((cite: hotspot/src/share/vm/prims/jvmtiEventController.cpp))
// If running in fullspeed mode, single stepping is implemented
// as follows: first, the interpreter does not dispatch to
// compiled code for threads that have single stepping enabled;
// second, we deoptimize all methods on the thread's stack when
// interpreted-only mode is enabled the first time for a given
// thread (nothing to do if no Java frames yet).
(通常は InterpreterRuntime::at_safepoint() が終了する時に safepoint チェックがあり, その中で TemplateInterpreter::ignore_safepoints() が呼ばれて dispatch table を元に戻してしまう. しかし JvmtiExport::should_post_single_step() が true の時だけは戻さないので, SingleStep モードではずっと safepoint 用のテーブルのままになる).
この機能を有効にした場合 interp_only_mode になる (See: here for details).
singlestep capability を取得した場合に true になる JvmtiExport::can_* フィールドは以下の通り. (#TODO)
(See: here for details)
なお singlestep 用の capability を取得すると, (JvmtiExport::can_*() が変更されることに加えて) interp_only_mode 用に様々な最適化オプションが無効になる (See: here for details).
(なお breakpoint の場合には, JvmtiEventControllerPrivate::recompute_enabled() の中で JvmtiEnvThreadState::reset_current_location() が行われる. #TODO)
JvmtiEnv::SetEventCallbacks() -> (略) (See: here for details) -> JvmtiEventControllerPrivate::recompute_enabled() -> VMThread::execute() -> (略) (See: here for details) -> VM_ChangeSingleStep::doit() -> JvmtiEventControllerPrivate::set_should_post_single_step() -> JvmtiExport::set_should_post_single_step() -> Interpreter::notice_safepoints() (をサブクラスがオーバーライドしたもの)
(なお breakpoint の場合には, JvmtiEventControllerPrivate::recompute_enabled() の中で JvmtiEnvThreadState::reset_current_location() が行われる. #TODO)
JvmtiEnv::SetEventNotificationMode() -> (略) (See: here for details) -> JvmtiEventControllerPrivate::recompute_enabled() -> VMThread::execute() -> (略) (See: here for details) -> VM_ChangeSingleStep::doit() -> (同上)
* Template Interpreter の場合: _safept_table の各エントリ -> (略) (See: here for details) -> InterpreterRuntime::at_safepoint() -> JvmtiExport::at_single_stepping_point() -> JvmtiExport::post_single_step() * C++ Interpreter の場合: DEBUGGER_SINGLE_STEP_NOTIFY() マクロ -> InterpreterRuntime::at_safepoint() -> (同上)
See: here for details
See: here for details
(#Under Construction)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.