「jdb」

jdb,查找和修复Java程序中的问题。

命令行语法格式(SYNOPSIS)

jdb [options] [classname] [arguments]

options
命令行选项。查看Options部分。

classname
要调试的主类的名称。

arguments
传递给该类的main()方法的参数。

命令描述(DESCRIPTION)

Java Debugger(JDB)是用于Java类的命令行调试器。jdb命令及其选项调用JDB。jdb命令演示了Java平台调试器架构(JDBA),并提供本地或远程Java虚拟机(JVM)的检查和调试。
参阅Java Platform Debugger Architecture(JDBA):http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html

启动JDB会话(START A JDB SESSION)

有很多方法来启动JDB会话。

方法一
最常用的方法是让JDB将要调试的应用程序的主类和一个新的JVM一起启动。通过在命令行中用jdb命令代替java命令。例如,如果程序的主类是MyClass,则使用以下命令在JDB下进行调试:

jdb MyClass

以这种方式启动时,jdb命令将使用指定的参数调用第二个JVM,并加载指定的类,并在执行该类的第一条指令之前停止JVM。

方法二
将jdb附加到已经运行的JVM。启动JVM命令并在JVM实例运行时附加的jdb的语法如下。这将加载进程中的调试库,并指定要进行的连接的种类。

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass

然后,您可以使用以下命令将jdb命令附加到JVM上:

jdb -attach 8000

在这种情况下,jdb命令行中没有指定MyClass,因为jdb正在连接到现有的JVM实例,而不是启动新的JVM实例。

其他的方法
将调试器连接到JVM还有许多其他方法,并且所有这些都由jdb命令支持。在JDBA中有关于这些连接选项的其他文档。

基本的JDB命令(BASIC JDB COMMANDS)

以下是基本的jdb命令的列表。使用-help列出的其他命令。

help or ?
对识别的命令进行简要的说明。

run
启动JDB并设置断点后,可以使用run命令来执行调试的应用程序。
run命令仅在jdb命令启动调试应用程序时可用,而不是附加到现有JVM。

cont
在断点、异常、某步执行之后继续执行调试的应用程序。

print
显示Java对象和原始值。
对于原始类型的变量或字段,打印实际值。
对于对象,打印简短描述。有关获取有关对象的更多信息,参阅dump命令。
注意:要显示class的局部变量,在class编译时,必须使用javac -g选项进行编译。
print命令支持许多简单的Java表达式,包括具有方法调用的简单Java表达式,例如:

print MyClass.myStaticField

print myObj.myInstanceField

print i + j + k (i, j, k are primities and either fields or local variables)

print myObj.myMethod() (if myMethod returns a non-null)

print new java.lang.String(“Hello”).length()

dump
对于原始值,dump命令与print命令相同。
对于对象,dump命令打印对象中定义的每个字段的当前值。包括静态和实例字段。
dump命令支持与print命令相同的表达式功能。

threads
列出当前正在运行的线程。对于每个线程,打印其名称、当前状态、可用于其他命令的索引。在这个例子中,线程索引是4,线程是java.lang.Thread的一个实例,线程名称是main,它当前正在运行:

  1. (java.lang.Thread)0x1 main running

thread
选择一个线程成为当前线程。许多jdb命令都是基于当前线程的设置。使用threads命令中描述的线程索引来指定线程。

where
没有参数的where命令会dump「当前线程」的堆栈。
where all命令转储「当前线程组」中所有线程的堆栈。
where threadindex命令转储指定线程的堆栈。

如果当前线程通过breakpoint或suspend命令之类的事件挂起,则可以使用print和dump命令显示局部变量和字段。
up和down命令选择哪个栈帧是当前栈帧。

断点(BREAKPOINTS)

在JDB中,断点以行号或方法的第一条指令进行设置,例如:

stop at MyClass:22
在包含MyClass的源文件的第22行的第一条指令中设置一个断点。

stop in java.lang.String.length
在java.lang.String.length的开头设置一个断点。

stop in MyClass.<clinit>
<clinit>来识别MyClass的静态初始化代码。

当方法重载时,还必须指定其参数类型,来使断点选择正确的方法。例如MyClass.myMethod(int,java.lang.String)或MyClass.myMethod()。

clear命令使用以下语法删除断点:clear MyClass:45。使用没有参数的clear或stop命令显示当前设置的所有断点。

cont命令继续执行。

下一步(STEPPING)

无论是处在当前栈帧还是被调用方法,step命令都将执行下一行。next命令将执行到当前栈帧中的下一行。

异常(EXCEPTIONS)

抛出线程的调用堆栈中的任何地方没有catch语句,在发生异常时,JVM通常会打印异常跟踪并退出。但是,当在JDB下运行时,控制权将返回给JDB。然后,可以使用jdb命令来诊断异常的原因。

使用catch命令使调试的应用程序停止在其他抛出的异常,例如:catch java.io.FileNotFoundExceptioncatch mypackage.BigTroubleException
任何作为「指定类」或「子类」的实例的异常,会在应用程序抛出的时候停止。

ignore命令之前的catch命令的效果。ignore命令不会导致调试的JVM忽略特定的异常,而只能用于调试器。

命令支持的选项及含义(OPTIONS)

在命令行中使用jdb命令而不是java命令时,jdb命令可接受与java命令相同的许多选项,包括-D,-classpath和-X选项。以下列表包含jdb命令接受的其他选项:

支持的其他选项用来提供将调试器连接到要调试的JVM的备用机制。
有关这些连接备选方案的其他文档,参阅Java Platform Debugger Architecture(JPDA):http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html

-help
显示帮助信息。

-sourcepath dir1:dir2: . . .
在指定的路径中搜索源文件。如果未指定此选项,则使用当前路径。

-attach address
使用默认连接机制来将调试器附加到正在运行的JVM。

-listen address
等待指定address的JVM启动,使用标准连接器连接到它。

-launch
启动JDB后,立即启动要调试的应用程序。 -launch选项不需要运行命令。调试的应用程序启动后,然后在加载初始应用程序类之前停止。
此时,可以设置必要的断点,并使用cont命令继续执行。

-listconnectors
列出JVM中可用的连接器。

-connect connector-name:name1=value1
使用命名的连接器和列出的参数值连接到目标JVM。

-dbgtrace [flags]
打印调试jdb命令的信息。

-tclient
在JavaHot Spot VM Client中运行应用程序。

-tserver
在JavaHot Spot VM Server中运行应用程序。

-Joption
将option传递给JVM,参见java(1)。

向调试进程转发的选项(OPTIONS FORWARDED TO THE DEBUGGER PROCESS)

-v -verbose[:class|gc|jni]
打开详细模式。

-Dname=value
设置系统属性。

-classpath dir
dir为多个用冒号(:)分隔的目录,用于查找class。

-Xoption
非标准目标JVM选项。

相关文档(SEE ALSO)

· javac(1)
· java(1)
· javah(1)
· javap(1)

参考文献