jdb - Java 调试程序

jdb 帮助您查找和修复 Java 语言程序中的 bug。

结构

jdb [ options ] [ class ] [ arguments ]
options
命令行选项,说明如下。
class
开始调试的类的名称。
arguments
传给 class main() 方法的参数。

说明

Java 调试程序 jdb 是一种与 dbx 相似的命令行调试程序,用于调试 Java 类。它利用 Java 调试程序 API 来检查和调试本地或远程 Java 解释器。

启动 jdb 会话

与 dbx 一样,用 jdb 进行调试也有两种方法。最常用的方法是让 jdb 在启动要调试的类的同时启动 Java 解释器。这可以通过在命令行中用命令 jdb 代替 java 来做到。例如,要在 jdb 下启动 AppletViewer,可用下列命令:

C:\> jdb sun.applet.AppletViewer

C:\> jdb -classpath %INSTALL_DIR%\classes sun.applet.AppletViewer

采用这种方法启动时,jdb 用指定参数来调用另一个 Java 解释器,加载指定的类并在执行该类的第一个指令前先使解释器停止运行。

使用 jdb 的第二种方法是将它附接到某个已在运行的 Java 解释器上。出于安全方面的考虑,只有用 -Xdebug 选项来启动 Java 解释器,才能对它们进行调试。用 -Xdebug 选项启动 Java 解释器时,Java 解释器将输出一口令供 jdb 使用。此外,调试后的解释器决不能用 JIT 编译器来运行。用 -Djava.compiler=NONE 选项来禁止 JIT 编译器的加载。专门的调试程序类必须能为调试后的解释器所使用。这些类不是缺省运行时环境类库的组成部分。用 -Xbootclasspath;$INSTALL_DIR\jre\lib\rt.jar;$INSTALL_DIR\lib\tools.jar 选项使调试后的解释器能够定位所有必需的类。总之,启动 Java 解释器的命令如下:

   % java -Xdebug -Djava.compiler=NONE   \
     -Xbootclasspath:$INSTALL_DIR/jre/lib/rt.jar:$INSTALL_DIR/lib/tools.jar <class>

要将 jdb 附接到某个正在运行的 Java 解释器上(在知道了会话口令后),按如下命令对它进行调用:

C:\> jdb -host <hostname> -password <password>

基本的 jdb 命令

下面列出的是基本的 jdb 命令。Java 调试程序也支持某些其它命令,可用 jdb 的 help 命令列出这些命令。

注意:要浏览局部(堆栈)变量,必须先用 -g 选项来编译该类。

help?
最重要的 jdb 命令,help 命令列出可识别的命令及其简要说明。
print
浏览 Java 对象。print 命令调用对象的 toString() 方法,因此其输出格式将根据对象类的不同而不同。

类由其对象标识或名称指定。如果类已经被加载了,则可使用子字符串,例如用 Thread 表示的 java.lang.Thread

print 支持 Java 表达式,如 print MyClass.clsVar。目前还不支持方法调用。

dump
转储对象的实例变量。对象由其对象标识(一个十六进制整数)指定。

类由其对象标识或名称指定。如果类已经被加载了,则可使用子字符,例如用 Thread 表示的 java.lang.Thread。如果类未被加载,则必须指定其全名,该类将作为副作用加载。applet 运行前在所引用的类中设置断点时,就要用到这点。

dump 命令支持 Java 表达式,如 dump 0x12345678.myCache[3].foo。目前还不支持方法调用。

threads
列出线程。线程由其对象标识来引用。
 
where
不带参数的 where 转储当前线程的堆栈(用 thread 命令来设置)。where all 转储当前线程组中所有线程的堆栈。where 线程标识转储指定线程的堆栈。线程标识的形式为 t@<索引>,如 t@3。如果所请求的线程被挂起(由于位于断点处或通过 suspend 命令来挂起),则可用 printdump 命令来浏览局部(堆栈)和实例变量。updown 命令用于选择当前的堆栈框架。

断点

jdb 中可以在类中设置断点,例如 "stop at MyClass:45"。必须指定源文件的行号或方法名(断点此时设在该方法的第一个指令处)。clear 命令使用 "clear MyClass:45Class:45" 语法来删除断点。用不带参数的 clear 命令可列出当前设置的所有断点。cont 命令将使执行继续。用 step 命令可进行单步操作。

异常

当发生异常而 Java 程序的堆栈之上又没有这种异常的捕获语句时,Java 运行时环境通常将转储该异常跟踪,然后退出。然而,在 jdb 下运行时,该异常被当作不可恢复的断点处理,jdb 将停止在抛出异常的指令上。如果该类是用 -g 选项编译的,则可输出实例和局部变量以确定异常的起因。

可用 catch 命令捕捉一些特殊异常,例如:“catch FileNotFoundException”或“catch mypackage.BigTroubleException”。Java 调试工具保留有这些异常的列表,当其中的一种被抛出时,则看作在抛出该异常的指令上有断点。ignore 命令将从该列表中删除异常类。

注意: ignore 命令不会使 Java 解释器忽略特殊异常,它只使调试程序忽略它们。

选项

当在命令行中用 jdb 取代 Java 解释器时,jdb 接受的选项与 java 命令接受的选项相同。

当将 jdb 附接到正在运行的 Java 解释器会话上时,jdb 接受下列选项:

-host <主机名>
设置主机名,该主机上附接的解释器会话正处于运行状态。
-password <口令>
“登录”到活动的解释器会话中。这是用 -Xdebug 选项进行调用时 Java 解释器输出的口令。

环境变量

CLASSPATH
用于为系统提供用户定义类的路径。目录用分号分隔,例如:
    .;C:\users\dac\classes;C:\tools\java\classes

另请参阅

javac, java, javah, javap, javadoc