Jdb - 在 Java 程序中修复 Bug
介绍 Jdb
jdb - 查找和修复 Java 平台程序中的 bug
概要
jdb [options] [classname] [arguments]
选项
这代表了 jdb
命令行选项。请参阅 Jdb 命令的选项.
类名
这代表要调试的主类的名称。
参数
这代表传递给类 main()
方法的参数。
描述
Java 调试器 (JDB) 是一个简单的 Java 类命令行调试器。jdb
命令及其选项调用 JDB。jdb
命令演示了 Java 平台调试器架构,并提供对本地或远程 JVM 的检查和调试。
启动 JDB 会话
启动 JDB 会话有很多方法。最常用的方法是让 JDB 启动一个新的 JVM,其中包含要调试的应用程序的主类。为此,请在命令行中用 jdb
命令替换 java
命令。例如,如果您的应用程序的主类是 MyClass
,则使用以下命令在 JDB 下调试它
jdb MyClass
以这种方式启动时,jdb
命令会使用指定的参数调用第二个 JVM,加载指定的类,并在执行该类的第一个指令之前停止 JVM。
使用 jdb
命令的另一种方法是将其附加到正在运行的 JVM。启动 JVM 的语法,当 JVM 正在运行时,jdb
命令会附加到该 JVM,如下所示。这将加载进程内调试库,并指定要建立的连接类型。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass
然后,您可以使用以下命令将 jdb
命令附加到 JVM
jdb -attach 8000
8000 是正在运行的 JVM 的地址。
在这种情况下,MyClass
参数不会在 jdb
命令行中指定,因为 jdb
命令正在连接到现有的 JVM,而不是启动新的 JVM。
还有许多其他方法可以将调试器连接到 JVM,并且 jdb
命令都支持这些方法。Java 平台调试器架构提供了有关这些连接选项的更多文档。
断点
可以在 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
命令继续执行。
单步执行
step
命令将执行推进到下一行,无论它是在当前堆栈帧中还是在调用的方法中。next
命令将执行推进到当前堆栈帧中的下一行。
异常
当发生异常时,在抛出线程的调用堆栈中没有任何 catch
语句,JVM 通常会打印异常跟踪并退出。但是,在 JDB 下运行时,控制权将返回到抛出异常的 JDB。然后,您可以使用 jdb
命令诊断异常的原因。
使用 catch
命令使调试的应用程序在其他抛出的异常处停止,例如:catch java.io.FileNotFoundException
或 catch
mypackage.BigTroubleException
。任何作为指定类或子类的实例的异常都会在抛出异常的位置停止应用程序。
ignore
命令会否定之前 catch
命令的效果。ignore
命令不会使调试的 JVM 忽略特定异常,而只会忽略调试器。
Jdb 命令的选项
当您在命令行上使用 jdb
命令而不是 java
命令时,jdb
命令接受与 java
命令相同的许多选项。
jdb
命令接受以下选项
-help
显示帮助消息。
-sourcepath
dir1:
dir2:
...
使用指定的路径在指定的路径中搜索源文件。如果未指定此选项,则使用点的默认路径 (.
)。
-attach
address
使用默认连接机制将调试器附加到正在运行的 JVM。
-listen
address
等待正在运行的 JVM 使用标准连接器连接到指定的地址。
-listenany
等待正在运行的 JVM 使用标准连接器连接到任何可用的地址。
-launch
在 jdb
命令启动后立即启动调试的应用程序。-launch
选项消除了对 run
命令的需求。调试的应用程序将启动,然后在加载初始应用程序类之前停止。此时,您可以设置任何必要的断点,并使用 cont
命令继续执行。
-listconnectors
列出此 JVM 中可用的连接器。
-connect
connector-name:
name1=
value1....
使用命名的连接器和列出的参数值连接到目标 JVM。
-dbgtrace
flags
打印用于调试 jdb
命令的信息。
-tclient
在 Java HotSpot VM 客户端中运行应用程序。
-tserver
在 Java HotSpot VM 服务器中运行应用程序。
-J
option
将 option 传递给 JVM,其中 option 是 Java 应用程序启动器参考页面上描述的选项之一。例如,-J-Xms48m
将启动内存设置为 48 MB。请参阅 java 中的“Java 选项概述”。
以下选项将转发到调试程序进程
-v
或 -verbose``:
class|gc
|jni
打开详细模式。
-D
name=
value
设置系统属性。
-classpath
dir
列出要查找类的目录,这些目录由冒号分隔。
-X
option
非标准目标 JVM 选项。
支持其他选项以提供将调试器连接到要调试的 JVM 的备用机制。
上次更新: 2021 年 9 月 14 日