Java 工具集教程

jdb.exe Java 调试器

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 目录下面生成字节码文件,例如:

jdb.exe Java 调试器

打开命令行 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>
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号