jdb.exe 是 Java 开发工具包(JDK)中的一个工具,用于在调试模式下启动 Java 调试器。它提供了一组命令行工具,可以用于在运行中的 Java 程序中设置断点、监视变量、执行程序、跟踪执行过程等操作,以帮助开发人员调试和定位代码中的问题。
jdb <options> <class> <arguments>
-help 输出此消息并退出
-sourcepath <由 ";" 分隔的目录> 要在其中查找源文件的目录
-attach <address> 使用标准连接器附加到指定地址处正在运行的 VM
-listen <address> 等待正在运行的 VM 使用标准连接器在指定地址处连接
-listenany 等待正在运行的 VM 使用标准连接器在任何可用地址处连接
-launch 立即启动 VM 而不是等待 'run' 命令
-listconnectors 列出此 VM 中的可用连接器
-connect <connector-name>:<name1>=<value1>,... 使用所列参数值通过指定的连接器连接到目标 VM
-dbgtrace [flags] 输出信息供调试jdb
-tclient 在 HotSpot(TM) 客户机编译器中运行应用程序
-tserver 在 HotSpot(TM) 服务器编译器中运行应用程序
转发到被调试进程的选项:
-v -verbose[:class|gc|jni] 启用详细模式
-D<name>=<value> 设置系统属性
-classpath <由 ";" 分隔的目录> 列出要在其中查找类的目录
-X<option> 非标准目标 VM 选项
<class> 是要开始调试的类的名称
<arguments> 是传递到 <class> 的 main() 方法的参数
要获得命令的帮助, 请在jdb提示下键入 'help'
在使用 Java 调试器 jdb 时,有许多命令选项可用于控制程序的执行和调试。以下是一些常用的 jdb 调试命令选项:
run:启动程序并开始调试。
stop in <class>.<method>:在指定类的指定方法中设置断点。
stop at <class>:<line>:在指定类的指定行号处设置断点。
list:列出当前执行位置周围的源代码。
step:单步执行程序,逐行执行代码。
next:执行当前行,然后停在下一行。
cont:继续执行程序,直到下一个断点或程序结束。
print <expression>:打印表达式的值。
locals:显示当前作用域内的局部变量。
watch <expression>:监视表达式的值,当值发生变化时停止程序执行。
where:显示当前的堆栈跟踪信息。
thread:显示当前线程的信息。
suspend:暂停所有线程的执行。
resume:恢复所有线程的执行。
exit:退出调试器。
假如我们有如下简单代码:
package com.hxstrive.jdb; /** * 简单 Java 程序,演示 jdb 用法 * @author HuangXin * @since 1.0.0 2024/2/28 13:36 */ public class SimpleDebugger { public static void main(String[] args) { int a = 5; int b = 10; int sum = a + b; System.out.println("The sum is: " + sum); } }
在 IDEA 中代码编译后,会在项目 target/classes 目录下面生成字节码文件,例如:
打开命令行 DOS 窗口,进入到 target/classes 目录,执行 jdb 命令调试程序,如下:
# 使用 jdb 调试 SimpleDebugger 程序 E:\demo\target\classes> jdb com.hxstrive.jdb.SimpleDebugger 正在初始化jdb... > stop in com.hxstrive.jdb.SimpleDebugger.main # 在 main 方法第一行设置断点 正在延迟断点com.hxstrive.jdb.SimpleDebugger.main。 将在加载类后设置。 > run # 运行程序 运行com.hxstrive.jdb.SimpleDebugger 设置未捕获的java.lang.Throwable 设置延迟的未捕获的java.lang.Throwable > VM 已启动: 设置延迟的断点com.hxstrive.jdb.SimpleDebugger.main 断点命中: "线程=main", com.hxstrive.jdb.SimpleDebugger.main(), 行=11 bci=0 main[1] step # 进入到我们设置的断点 > 已完成的步骤: "线程=main", com.hxstrive.jdb.SimpleDebugger.main(), 行=12 bci=2 main[1] print a # 打印变量 a 的值 a = 5 main[1] print b # 打印变量 b 的值 com.sun.tools.example.debug.expr.ParseException: Name unknown: b b = 空值 main[1] step # 执行下一条语句 > 已完成的步骤: "线程=main", com.hxstrive.jdb.SimpleDebugger.main(), 行=13 bci=5 main[1] print b # 打印变量 b 的值 b = 10 main[1] list # 列出当前行附件的源码 找不到源文件: SimpleDebugger.java main[1] step > 已完成的步骤: "线程=main", com.hxstrive.jdb.SimpleDebugger.main(), 行=14 bci=9 main[1] where # 输出当前行的位置 [1] com.hxstrive.jdb.SimpleDebugger.main (SimpleDebugger.java:14) main[1] cont > The sum is: 15 应用程序已退出 E:\demo\target\classes>