![]() 快照
|
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 命令列出可识别的命令及其简要说明。
- 浏览 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 命令来挂起),则可用 print 和 dump 命令来浏览局部(堆栈)和实例变量。up 和 down 命令用于选择当前的堆栈框架。断点
在 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