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命令将使用指定的参数调用第二个JVM,并加载指定的类,并在执行该类的第一条指令之前停止JVM。
方法二
将jdb附加到已经运行的JVM。启动JVM命令并在JVM实例运行时附加的jdb的语法如下。这将加载进程中的调试库,并指定要进行的连接的种类。
然后,您可以使用以下命令将jdb命令附加到JVM上:
在这种情况下,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 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,它当前正在运行:
- (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.FileNotFoundException或catch 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)
参考文献
- http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdb.html#CHDGJCIE
- man 1 jdb, version OpenJDK Runtime Environment (build 1.8.0_121-8u121-b13-4-b13)