- 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: