调试 Java 应用程序时,dbx 处于以下三种模式之一:
Java 模式
JNI 模式
本地模式
当 dbx 处于 Java 模式或 JNI(Java Native Interface,Java 本地接口)模式下时,可以检查 Java 应用程序(包括 JNI 代码)的状态,并控制代码的执行。当 dbx 处于本地模式下时,可以检查 C 或 C++ JNI 代码的状态。当前模式(java、jni、native)存储在环境变量 jdbx_mode 中。
在 Java 模式下,可以使用 Java 语法与 dbx 交互,dbx 会使用 Java 语法显示信息。此模式用于调试纯 Java 代码或使用 Java 代码、C JNI 代码或 C++ JNI 代码混合编写的应用程序中的 Java 代码。
在 JNI 模式下,dbx 命令使用本地语法并会影响本地代码,但命令的输出既显示与 Java 有关的状态,也显示本地状态,所以 JNI 模式是一种“混合”模式。此模式用于调试使用 Java 代码、C JNI 代码或 C++ JNI 代码混合编写的应用程序的本地部分。
在本地模式下,dbx 命令只影响本地程序,所有与 Java 有关的功能都会被禁用。此模式用于调试与 Java 无关的程序。
在执行 Java 应用程序的过程中,dbx 会根据情况自动在 Java 模式和 JNI 模式间切换。例如,遇到 Java 断点时,dbx 会自动切换到 Java 模式,而当您从 Java 代码步入 JNI 代码时,它又会切换到 JNI 模式。
dbx 不会自动切换到本地模式。可以使用 joff 命令显式从 Java 模式或 JNI 模式切换到本地模式,也可以使用 jon 命令从本地模式切换到 Java 模式。
如果中断执行 Java 应用程序(例如,使用 Ctrl-C),dbx 会尝试通过将应用程序置于安全状态并挂起所有线程将模式自动设置为 Java/JNI 模式。
如果 dbx 无法挂起应用程序并切换到 Java/JNI 模式,dbx 便会切换到本地模式。然后,您可以使用 jon 命令切换到 Java 模式来检查程序的状态。