现已推出!阅读 10 月份的新功能和修复。

运行和调试 Java

Visual Studio Code 允许您通过 Java 调试器 扩展调试 Java 应用程序。它是一个轻量级的 Java 调试器,基于 Java 调试服务器,该服务器扩展了 Red Hat 的 Java™ 语言支持

以下是支持的调试功能列表

  • 启动/附加
  • 断点
  • 异常
  • 暂停和继续
  • 单步执行/跳出/跳过
  • 变量
  • 调用堆栈
  • 线程
  • 调试控制台
  • 评估
  • 热代码替换

Java 调试器是一个开源项目,欢迎贡献者通过 GitHub 代码库进行协作

如果您在使用以下功能时遇到任何问题,可以通过创建一个 问题 联系我们。

安装

要获得 Visual Studio Code 中完整的 Java 语言支持,您可以安装 Java 扩展包,其中包含 Java 调试器扩展。

安装 Java 扩展包

有关如何开始使用扩展包的详细信息,您可以查看 Java 入门 教程。

配置

默认情况下,调试器将开箱即用,通过自动查找主类并在内存中生成默认启动配置来启动您的应用程序。

如果您想自定义和持久化启动配置,可以在 运行和调试 视图中选择 创建 launch.json 文件 链接。

Debug Menu

launch.json 文件位于工作区(项目根文件夹)中的 .vscode 文件夹中。

有关如何创建 launch.json 的更多详细信息,请阅读 启动配置;有关 Java 配置选项的更多详细信息,您可以阅读 配置选项

运行和调试

调试器扩展提供了多种运行和调试 Java 应用程序的方法。

从 CodeLens 运行

您将在 main() 函数的 CodeLens 中找到 运行|调试

CodeLens

从编辑器菜单运行

另一种启动调试的方法是从顶部编辑器标题栏中选择 运行 Java调试 Java 菜单。

EditorMenu

从按 F5 运行

F5,调试器将自动查找项目的入口点并启动调试。您也可以从 VS Code 侧边栏的 运行和调试 视图中启动调试会话。有关更多信息,请参阅 VS Code 中的调试

调试单个文件

除了支持调试由构建工具管理的 Java 项目之外,VS Code 还支持调试单个 Java 文件而无需任何项目。

调试会话输入

VS Code 中的默认调试控制台不支持输入。如果您的程序需要从终端接收输入,可以使用 VS Code 中的集成终端(⌃` (Windows、Linux Ctrl+`))或外部终端来启动它。您还可以使用用户设置 java.debug.settings.console 为所有 Java 调试会话配置全局控制台。

断点

Java 调试器支持各种断点,例如行断点、条件断点、数据断点、日志点。

断点 - 条件断点

借助表达式计算,调试器还支持条件断点。您可以设置断点,使其在表达式计算结果为 true 时中断。

断点 - 数据断点

当变量的值发生变化时,您可以让调试器中断。请注意,数据断点只能在调试会话中设置。这意味着您需要先启动应用程序,并在常规断点处中断。然后,您可以选择 变量 视图中的一个字段,并设置数据断点。

Data Breakpoint

断点 - 日志点

日志点 也受 Java 调试器支持。日志点允许您将输出发送到调试控制台,而无需编辑代码。它们不同于断点,因为它们不会停止应用程序的执行流程。

断点 - 触发断点

触发断点是当另一个断点命中时自动启用的断点。当诊断代码中仅在特定前提条件后发生的故障情况时,它们非常有用。

可以通过右键单击字形边距,选择 添加触发断点,然后选择哪个断点启用该断点来设置触发断点。

表达式计算

调试器还允许您在 监视 窗口以及调试控制台中评估表达式。

热代码替换

调试器支持的另一个高级功能是“热代码”替换。热代码替换 (HCR) 是一种调试技术,通过该技术,Java 调试器将类更改通过调试通道传输到另一个 Java 虚拟机 (JVM)。HCR 有助于实验性开发,并促进迭代试错编码。使用此新功能,您可以启动调试会话并在开发环境中更改 Java 文件,调试器将替换运行中的 JVM 中的代码。无需重新启动,这就是它被称为“热”的原因。以下是使用 VS Code 中的 Java 调试器进行 HCR 的示例。

您可以使用调试设置 java.debug.settings.hotCodeReplace 来控制如何触发热代码替换。可能的设置值是

  • manual - 单击工具栏以应用更改(默认)。
  • auto - 编译后自动应用更改。
  • never - 禁用热代码替换。

步骤过滤

步骤过滤器受扩展支持,用于过滤掉您在调试时不想查看或单步执行的类型。使用此功能,您可以在 launch.json 中配置要过滤的包,以便在单步执行时跳过它们。

配置选项

有许多选项和设置可用于配置调试器。例如,通过启动选项可以轻松配置 JVM 参数和环境变量。

有关设置项目的帮助,请查阅 Red Hat 的 Java™ 语言支持 扩展的文档。

对于许多常用的设置,在 VS Code Java 调试器配置 中提供了示例。本文档解释了 Java 调试器如何自动为您生成配置,以及如果您需要修改它们,如何使用主类、不同的参数、环境、附加到其他 Java 进程以及使用更高级的功能来进行修改。

以下是所有可用于 LaunchAttach 的配置。有关如何编写 launch.json 文件的更多信息,请参阅 调试

启动

  • mainClass (必需) - 程序入口的完全限定类名(例如 [java 模块名称/]com.xyz.MainApp)或 java 文件路径。
  • args - 传递给程序的命令行参数。使用 "${command:SpecifyProgramArgs}" 提示输入程序参数。它接受字符串或字符串数组。
  • sourcePaths - 程序的额外源目录。默认情况下,调试器从项目设置中查找源代码。此选项允许调试器在额外目录中查找源代码。
  • modulePaths - 启动 JVM 的模块路径。如果未指定,调试器将自动从当前项目中解析。
    • $Auto - 自动解析当前项目的模块路径。
    • $Runtime - 当前项目“运行时”范围内的模块路径。
    • $Test - 当前项目“测试”范围内的模块路径。
    • !/path/to/exclude - 从模块路径中排除指定路径。
    • /path/to/append - 将指定路径附加到模块路径。
  • classPaths - 启动 JVM 的类路径。如果未指定,调试器将自动从当前项目中解析。
    • $Auto - 自动解析当前项目的类路径。
    • $Runtime - 当前项目“运行时”范围内的类路径。
    • $Test - 当前项目“测试”范围内的类路径。
    • !/path/to/exclude - 从类路径中排除指定路径。
    • /path/to/append - 将指定路径附加到类路径。
  • encoding - JVM 的 file.encoding 设置。如果未指定,将使用“UTF-8”。可以在 支持的编码 中找到可能的取值。
  • vmArgs - JVM 的额外选项和系统属性(例如 -Xms<size> -Xmx<size> -D<name>=<value>),它接受字符串或字符串数组。
  • projectName - 调试器在其中搜索类的首选项目。不同的项目中可能存在重复的类名。当调试器在启动程序时查找指定的主类时,此设置也有效。当工作区包含多个 Java 项目时,这是必需的,否则表达式求值和条件断点可能无法正常工作。
  • cwd - 程序的工作目录。默认为 ${workspaceFolder}
  • env - 程序的额外环境变量。
  • envFile - 包含环境变量定义的文件的绝对路径。
  • stopOnEntry - 启动后自动暂停程序。
  • console - 指定的用于启动程序的控制台。如果未指定,则使用由 java.debug.settings.console 用户设置指定的控制台。
    • internalConsole - VS Code 调试控制台(不支持输入流)。
    • integratedTerminal - VS Code 集成终端。
    • externalTerminal - 可在用户设置中配置的外部终端。
  • shortenCommandLine - 当项目具有很长的类路径或大型 VM 参数时,启动程序的命令行可能会超过操作系统允许的最大命令行字符串限制。此配置项提供了多种方法来缩短命令行。默认为 auto
    • none - 使用标准命令行“java {options} classname {args}”启动程序。
    • jarmanifest - 将类路径参数生成到一个临时 classpath.jar 文件中,并使用命令行“java -cp classpath.jar classname {args}”启动程序。
    • argfile - 将类路径参数生成到一个临时参数文件中,并使用命令行“java @argfile {args}”启动程序。此值仅适用于 Java 9 及更高版本。
    • auto - 自动检测命令行长度,并确定是否要通过适当的方法缩短命令行。
  • stepFilters - 步进时跳过指定类或方法。
    • classNameFilters - [已弃用 - 由 skipClasses 替代] 步进时跳过指定类。类名应为完全限定名。支持通配符。
    • skipClasses - 步进时跳过指定类。您可以使用内置变量,例如 '$JDK' 和 '$Libraries' 来跳过一组类,或添加特定类名表达式,例如 java.**.Foo
    • skipSynthetics - 步进时跳过合成方法。
    • skipStaticInitializers - 步进时跳过静态初始化器方法。
    • skipConstructors - 步进时跳过构造函数方法。

附加

  • hostName (必需) - 远程调试对象的主机名或 IP 地址。
  • port (必需) - 远程调试对象的调试端口。
  • processId - 使用进程选择器选择要附加的进程,或使用整数形式的进程 ID。
    • ${command:PickJavaProcess} - 使用进程选择器选择要附加的进程。
    • 整数 PID - 附加到指定的本地进程。
  • timeout - 重新连接之前的超时值,以毫秒为单位(默认值为 30000 毫秒)。
  • sourcePaths - 程序的额外源目录。默认情况下,调试器从项目设置中查找源代码。此选项允许调试器在额外目录中查找源代码。
  • projectName - 调试器在其中搜索类的首选项目。不同的项目中可能存在重复的类名。当工作区包含多个 Java 项目时,这是必需的,否则表达式求值和条件断点可能无法正常工作。
  • stepFilters - 步进时跳过指定类或方法。
    • classNameFilters - [已弃用 - 由 skipClasses 替代] 步进时跳过指定类。类名应为完全限定名。支持通配符。
    • skipClasses - 步进时跳过指定类。您可以使用内置变量,例如 '$JDK' 和 '$Libraries' 来跳过一组类,或添加特定类名表达式,例如 java.**.Foo
    • skipSynthetics - 步进时跳过合成方法。
    • skipStaticInitializers - 步进时跳过静态初始化器方法。
    • skipConstructors - 步进时跳过构造函数方法。

用户设置

  • java.debug.logLevel: 发送到 VS Code 的调试器日志的最小级别,默认为 warn
  • java.debug.settings.showHex: 在 变量 中以十六进制格式显示数字,默认为 false
  • java.debug.settings.showStaticVariables: 在 变量 中显示静态变量,默认为 false
  • java.debug.settings.showQualifiedNames: 在 变量 中显示完全限定的类名,默认为 false
  • java.debug.settings.showLogicalStructure: 在 变量 中显示 Collection 和 Map 类的逻辑结构,默认为 true
  • java.debug.settings.showToString: 在 变量 中显示所有覆盖了“toString”方法的类的“toString()”值,默认为 true
  • java.debug.settings.maxStringLength: 在 变量调试控制台 中显示的字符串的最大长度。超过此限制的字符串将被截断。默认值为 0,表示不进行截断。
  • java.debug.settings.hotCodeReplace: 在调试期间重新加载已更改的 Java 类,默认为 manual。确保 Java 语言支持扩展 未禁用 java.autobuild.enabled。有关用法和限制的更多信息,请参阅 热代码替换 Wiki 页面
    • manual - 单击工具栏以应用更改。
    • auto - 编译后自动应用更改。
    • never - 从不应用更改。
  • java.debug.settings.enableHotCodeReplace: 启用 Java 代码的热代码替换。确保 VS Code Java 未禁用自动构建。有关用法和限制的更多信息,请参阅 热代码替换 Wiki 页面
  • java.debug.settings.enableRunDebugCodeLens: 启用主入口点上的运行和调试按钮的 CodeLens 提供程序,默认为 true
  • java.debug.settings.forceBuildBeforeLaunch: 在启动 Java 程序之前强制构建工作区,默认为 true
  • java.debug.settings.console: 指定的用于启动 Java 程序的控制台,默认为 integratedTerminal。如果您想为特定调试会话自定义控制台,请修改 launch.json 中的 console 配置。
    • internalConsole - VS Code 调试控制台(不支持输入流)。
    • integratedTerminal - VS Code 集成终端。
    • externalTerminal - 可在用户设置中配置的外部终端。
  • java.debug.settings.exceptionBreakpoint.skipClasses: 在遇到异常时跳过指定类。您可以使用内置变量,例如 '$JDK' 和 '$Libraries' 来跳过一组类,或添加特定类名表达式,例如 java.**.Foo
  • java.debug.settings.stepping.skipClasses: 步进时跳过指定类。您可以使用内置变量,例如 '$JDK' 和 '$Libraries' 来跳过一组类,或添加特定类名表达式,例如 java.**.Foo
  • java.debug.settings.stepping.skipSynthetics: 步进时跳过合成方法。
  • java.debug.settings.stepping.skipStaticInitializers: 步进时跳过静态初始化器方法。
  • java.debug.settings.stepping.skipConstructors: 步进时跳过构造函数方法。
  • java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest: 一个 JDWP 请求中可以请求的变量或字段的最大数量。值越大,在扩展变量视图时调试对象请求的频率越低。同样,较大的数字会导致 JDWP 请求超时。默认值为 100。
  • java.debug.settings.jdwp.requestTimeout: 调试器与目标 JVM 通信时 JDWP 请求的超时时间(毫秒)。默认值为 3000。
  • java.debug.settings.vmArgs: 启动 Java 程序的默认 VM 参数。例如,使用“ -Xmx1G -ea” 将堆大小增加到 1 GB 并启用断言。如果您想为特定调试会话自定义 VM 参数,可以在 launch.json 中修改“vmArgs”配置。
  • java.silentNotification: 控制是否可以使用通知来报告进度。如果为真,则使用状态栏来报告进度。默认为 false

故障排除

如果您在使用调试器时遇到问题,可以在 vscode-java-debug GitHub 存储库 中找到详细的故障排除指南。

解释了常见问题,包括

  • Java 语言支持扩展无法启动。
  • 构建失败,您要继续吗?
  • *.java 不在类路径中。将仅报告语法错误。
  • 程序错误:无法找到或加载主类 X。
  • 程序抛出 ClassNotFoundException。
  • 热代码替换失败。
  • 请在 launch.json 中指定远程调试对象的 hostname 和端口。
  • 评估失败。原因:无法评估,因为线程已恢复。
  • 找不到包含 main 方法的类。
  • 启动调试器时没有 vscode.java.startDebugSession 的委托命令处理程序。
  • 无法解析类路径。
  • 不支持请求类型“X”。仅支持“launch”和“attach”。

反馈和问题

您可以在 vscode-java-debug 存储库中找到问题的完整列表。您可以提交 错误或功能建议,并参与社区驱动的 vscode-java-debug Gitter 频道

下一步

继续阅读以了解更多信息

  • 调试 - 了解如何使用 VS Code 中的调试器与任何语言的项目进行调试。

以及 Java

  • Java 测试 - 使用 Java Test Runner 扩展在 VS Code 中测试 Java。
  • Java 扩展 - 了解 VS Code 中更多有用的 Java 扩展。