- Event?Command Set (64)
- Composite?(100)
事件命令集 (64)
復合命令 (100)
目標虛擬機中的給定時間可能會發生多個事件。 例如,給定位置可能有多個斷點請求,或者您可能單步執行到與斷點請求相同的位置。 這些事件作為復合事件一起傳遞。 為了統一,即使只有一個事件要報告,也始終使用復合事件來傳遞事件。
組合在復合事件中的事件受到以下方式的限制:
僅適用于同一線程的其他線程啟動事件:
線程啟動事件
僅適用于同一線程的其他線程死亡事件:
線程死亡事件
僅與其他類一起為同一類準備活動:
類準備活動
僅與同一類的其他類卸載事件一起使用:
類卸載事件
僅與同一字段訪問的其他訪問觀察點事件一起使用:
訪問觀察點事件
僅與同一字段修改的其他修改觀察點事件一起使用:
修改觀察點事件
僅與其他監視器競爭同一監視器對象的輸入事件:
監控競爭進入事件
僅與其他監視器競爭同一監視器對象的輸入事件:
監控競爭輸入事件
僅適用于同一監視器對象的其他監視器等待事件:
監控等待事件
僅適用于同一監視器對象的其他監視器等待事件:
監控等待事件
僅與發生相同異常的其他 ExceptionEvent 一起使用:
異常事件
僅與該組的其他成員在同一位置且在同一線程中:
斷點事件
步驟事件
方法進入事件
方法退出事件
VM 啟動事件和VM 死亡事件是自動生成的事件。 這意味著不需要使用 EventRequest.Set 命令來請求它們。 VM Start 事件表示 VM 初始化完成。 VM 死亡事件表示 VM 終止。如果在自動生成的事件發生時連接了調試器,則該事件會從目標 VM 發送。 還可以使用 EventRequest.Set 命令請求自動生成的事件,因此當事件發生時,將從目標 VM 發送相同事件類型的多個事件。自動生成的事件在事件數據中的 requestID 字段設置為 0 的情況下發送 事件數據中的 suspendPolicy 字段的值取決于事件。 對于自動生成的 VM 啟動事件,未定義 suspendPolicy 的值,因此是特定于實現或配置的。 例如,在 Sun 實現中,在啟動時將 suspendPolicy 指定為 JDWP 代理的一個選項。自動生成的 VM 死亡事件會將 suspendPolicy 設置為 NONE。
eventKind 可能由如下類型 :
(1 ) Case VMStart - if?eventKind?is JDWP.EventKind.VM_START:
目標 VM 初始化的通知。 在主線程啟動之前和執行任何應用程序代碼之前接收此事件。 在此事件發生之前,已執行大量系統代碼并加載了許多系統類。 即使沒有明確請求,此事件始終由目標 VM 生成。
? ?(2) Case Breakpoint - if eventKind is JDWP.EventKind.BREAKPOINT:
目標虛擬機中的斷點通知。 斷點事件是在執行其所在位置的代碼之前生成的。
(3)Case SingleStep - if?eventKind?is JDWP.EventKind.SINGLE_STEP:
目標 VM 中步驟完成的通知。 步驟事件是在執行其所在位置的代碼之前生成的。
(4)Case MethodEntry - if?eventKind?is JDWP.EventKind.METHOD_ENTRY(方法步入):
目標 VM 中方法調用的通知。 該事件在調用方法中的任何代碼執行之前生成。 為本地(native)和非本地(non-native)方法生成方法進入事件。
在某些 VM 中,如果方法作為線程初始化的一部分被調用,則特定線程的方法進入事件可能會在其線程啟動事件發生之前發生。
(5)
Case MethodExit - if?eventKind?is JDWP.EventKind.METHOD_EXIT(方法退出):?
目標 VM 中方法返回的通知。 該事件在方法中所有代碼執行完畢后生成,但該事件的位置是方法中最后執行的位置。 本地(native)和非本機(native)方法都會生成方法退出事件。 如果方法因拋出異常而終止,則不會生成方法退出事件。
(6)
Case MethodExitWithReturnValue - if?eventKind?is JDWP.EventKind.METHOD_EXIT_WITH_RETURN_VALUE:
目標 VM 中方法返回的通知。 該事件在方法中所有代碼執行完畢后生成,但該事件的位置是方法中最后執行的位置。 本機和非本機方法都會生成方法退出事件。 如果方法因拋出異常而終止,則不會生成方法退出事件。
從 JDWP 1.6 版本開始。
(7)
Case MonitorContendedEnter - if?eventKind?is JDWP.EventKind.MONITOR_CONTENDED_ENTER:
通知目標 VM 中的線程正在嘗試進入已被另一個線程獲取的監視器。 需要 canRequestMonitorEvents 功能 - 請參閱新功能。
從 JDWP 1.6 版本開始。
(8)
Case MonitorContendedEntered - if?eventKind?is JDWP.EventKind.MONITOR_CONTENDED_ENTERED:
目標VM中的線程在等待另一個線程釋放后進入監視器的通知。 需要 canRequestMonitorEvents 功能 - 請參閱新功能。
從 JDWP 1.6 版本開始。
(9)
?? ?Case MonitorWait - if eventKind is JDWP.EventKind.MONITOR_WAIT:
線程即將等待監視器對象的通知。 需要 canRequestMonitorEvents 功能 - 請參閱新功能。
從 JDWP 1.6 版本開始。
(10)
Case MonitorWaited - if?eventKind?is JDWP.EventKind.MONITOR_WAITED:
目標 VM 中的線程已完成等待的通知 需要 canRequestMonitorEvents 功能 - 請參閱新功能。 一個監控對象。
從 JDWP 1.6 版本開始。
(11)
Case Exception - if?eventKind?is JDWP.EventKind.EXCEPTION:
目標 VM 中的異常通知。 如果異常是從非本地方法引發的,則異常事件將在引發異常的位置生成。 如果異常是從本地方法引發的,則異常事件將在引發異常后到達的第一個非本地位置生成。
(12)
Case ThreadStart - if?eventKind?is JDWP.EventKind.THREAD_START:
目標虛擬機中新運行線程的通知。 新線程可以是調用 java.lang.Thread.start 的結果,也可以是通過 JNI 將新線程附加到 VM 的結果。 該通知由新線程在執行開始前的某個時間生成。 由于這個計時,有可能在接收到該事件之前接收線程的其他事件。 (值得注意的是,方法進入事件和方法退出事件可能在線程初始化期間發生。VirtualMachine AllThreads 命令也可能在收到線程啟動事件之前返回線程。
請注意,此事件沒有提供有關線程對象創建的信息,該線程對象可能已經發生得更早,具體取決于正在調試的 VM。
(13)
Case ThreadDeath - if?eventKind?is JDWP.EventKind.THREAD_DEATH:
目標 VM 中已完成線程的通知。 該通知是由垂死線程在終止之前生成的。 由于這個時間安排,{@link VirtualMachine#allThreads} 可能會在收到此事件后返回此線程。
請注意,此事件不提供有關線程對象生命周期的信息。 它可能會也可能不會很快被收集,具體取決于目標虛擬機中存在哪些引用。
(14)
Case ClassPrepare - if?eventKind?is JDWP.EventKind.CLASS_PREPARE:
目標 VM 中的類準備通知。 有關類準備的定義,請參閱 JVM 規范。 不會為原始類(例如 java.lang.Integer.TYPE)生成類準備事件。
準備線程。 在極少數情況下,此事件可能發生在目標 VM 內的調試器系統線程中。 調試器線程采取預防措施來防止這些事件,但在某些情況下它們是無法避免的,特別是對于 java.lang.Error 的某些子類。 如果該事件是由調試器系統線程生成的,則此方法返回的值為 null,并且如果該事件請求的掛起策略是 EVENT_THREAD,則所有線程都將掛起,并且復合事件的掛起策略將反映此更改。 請注意,上面的討論不適用于目標虛擬機在其正常(非調試)操作期間創建的系統線程。
(15)
Case ClassUnload - if?eventKind?is JDWP.EventKind.CLASS_UNLOAD:
目標 VM 中的類卸載通知。
垃圾收集期間調試器后端受到嚴格限制,因此卸載信息受到很大限制。
(16)
Case FieldAccess - if?eventKind?is JDWP.EventKind.FIELD_ACCESS:
目標虛擬機中的現場訪問通知。 字段修改不被視為字段訪問。 需要 canWatchFieldAccess 功能 - 請參閱新功能。
(17)
?? ?Case FieldModification - if eventKind is JDWP.EventKind.FIELD_MODIFICATION:
目標虛擬機中字段修改的通知。 需要 canWatchFieldModification 功能 - 請參閱新功能。
(18)
Case VMDeath - if?eventKind?is JDWP.EventKind.VM_DEATH: