Up Top

Serviceability 機能 : JVMTI の処理 : JVMTI 関数の処理 : イベント管理 (Event Management) : 各イベントの通知処理 : SingleStep イベントの処理


概要(Summary)

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

備考(Notes)

(通常は InterpreterRuntime::at_safepoint() が終了する時に safepoint チェックがあり, その中で TemplateInterpreter::ignore_safepoints() が呼ばれて dispatch table を元に戻してしまう. しかし JvmtiExport::should_post_single_step() が true の時だけは戻さないので, SingleStep モードではずっと safepoint 用のテーブルのままになる).

処理の流れ (概要)(Execution Flows : Summary)

singlestep 関係の capability の有効化処理 (AddCapabilities() の処理)

(See: here for details)

なお singlestep 用の capability を取得すると, (JvmtiExport::can_*() が変更されることに加えて) interp_only_mode 用に様々な最適化オプションが無効になる (See: here for details).

singlestep 関係のコールバックの設定処理 (SetEventCallbacks() の処理)

(なお 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() (をサブクラスがオーバーライドしたもの)

singlestep 関係のイベント通知の有効化処理 (NotificationMode() の処理)

(なお 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()
               -> (同上)

singlestep モードでの実行処理

* 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()
     -> (同上)

処理の流れ (詳細)(Execution Flows : Details)

VM_ChangeSingleStep::doit()

See: here for details

JvmtiEventControllerPrivate::set_should_post_single_step()

See: here for details

JvmtiExport::set_should_post_single_step()

(#Under Construction)

TemplateInterpreter::notice_safepoints()

See: here for details

CppInterpreter::notice_safepoints()

See: here for details

InterpreterRuntime::at_safepoint()

See: here for details

JvmtiExport::at_single_stepping_point()

See: here for details

JvmtiExport::post_single_step()

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.