系列中的上一篇
当前教程
Jdb - 在 Java 程序中修复 Bug

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。使用没有参数的 clearstop 命令将显示当前设置的所有断点的列表。cont 命令继续执行。

 

单步执行

step 命令将执行推进到下一行,无论它是在当前堆栈帧中还是在调用的方法中。next 命令将执行推进到当前堆栈帧中的下一行。

 

异常

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

使用 catch 命令使调试的应用程序在其他抛出的异常处停止,例如:catch java.io.FileNotFoundExceptioncatch 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 服务器中运行应用程序。

-Joption

option 传递给 JVM,其中 option 是 Java 应用程序启动器参考页面上描述的选项之一。例如,-J-Xms48m 将启动内存设置为 48 MB。请参阅 java 中的“Java 选项概述”。

以下选项将转发到调试程序进程

-v-verbose``:class|gc|jni

打开详细模式。

-Dname=value

设置系统属性。

-classpath dir

列出要查找类的目录,这些目录由冒号分隔。

-X option

非标准目标 JVM 选项。

支持其他选项以提供将调试器连接到要调试的 JVM 的备用机制。


上次更新: 2021 年 9 月 14 日


系列中的上一篇
当前教程
Jdb - 在 Java 程序中修复 Bug