hotspot/src/share/vm/prims/jvmtiExport.cpp
//
// JVMTI single step management
//
void JvmtiExport::at_single_stepping_point(JavaThread *thread, methodOop method, address location) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(JvmtiExport::should_post_single_step(), "must be single stepping");
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
HandleMark hm(thread);
methodHandle mh(thread, method);
{- -------------------------------------------
(1) 処理対象のスレッドの JvmtiThreadState を取得する.
JvmtiThreadState がまだ作られていなければ
(明らかにこのタイミングでのイベント通知は不要なので) ここでリターン.
---------------------------------------- -}
// update information about current location and post a step event
JvmtiThreadState *state = thread->jvmti_thread_state();
if (state == NULL) {
return;
}
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
EVT_TRIG_TRACE(JVMTI_EVENT_SINGLE_STEP, ("JVMTI [%s] Trg Single Step triggered",
JvmtiTrace::safe_get_thread_name(thread)));
{- -------------------------------------------
(1) (以降の処理は, SingleStep モードが隠蔽されていない (= hide_single_stepping() が false) 場合にのみ行う)
(なお, JvmtiThreadState::hide_single_stepping() は,
JvmtiHideSingleStepping により一時的に SingleStep モードが停止されているかどうかを返す.
(See: JvmtiHideSingleStepping))
---------------------------------------- -}
if (!state->hide_single_stepping()) {
{- -------------------------------------------
(1.1) もし PopFrame() 関数によって現在の関数フレームが破棄されることになっていれば,
JvmtiThreadState::process_pending_step_for_popframe() を呼ぶ.
(See: [here](no2935cDo.html) for details)
---------------------------------------- -}
if (state->is_pending_step_for_popframe()) {
state->process_pending_step_for_popframe();
}
{- -------------------------------------------
(1.1) もし ForceEarlyReturn*() 関数によって現在の関数フレームが破棄されることになっていれば,
JvmtiThreadState::process_pending_step_for_earlyret() を呼ぶ.
(See: [here](no3059azN.html) for details)
---------------------------------------- -}
if (state->is_pending_step_for_earlyret()) {
state->process_pending_step_for_earlyret();
}
{- -------------------------------------------
(1.1) JvmtiExport::post_single_step() を呼んで,
JVMTI_EVENT_SINGLE_STEP が有効になっている全てのスレッドにイベントを送付する.
---------------------------------------- -}
JvmtiExport::post_single_step(thread, mh(), location);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.