运行与调试 Java

Visual Studio Code 允许你通过 Debugger for Java 扩展调试 Java 应用程序。它是一款基于 Java Debug Server 的轻量级 Java 调试器,扩展了 Red Hat 对 Java™ 的语言支持

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

  • 发射/连接
  • 断点
  • 例外情况
  • 暂停与继续
  • 踏进/出/跨越
  • 变量
  • 调用堆栈
  • 螺丝
  • 调试控制台
  • 评价
  • 热码替换

Java 调试器是一个开源项目,欢迎贡献者通过 GitHub 仓库协作:

如果您在使用以下功能时遇到任何问题,可以通过输入问题与我们联系。

安装

要在 Visual Studio Code 中获得完整的 Java 语言支持,可以安装 Java 扩展包,其中包含 Debugger for Java 扩展。

安装 Java 扩展包

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

配置

默认情况下,调试器会通过自动找到主类并在内存中生成默认启动配置来启动你的应用程序。

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

调试菜单

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

关于如何创建launch.json,阅读发射配置;有关 Java 配置选项的更多细节,可以阅读配置选项

运行与调试

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

从CodeLens跑

你会找到Run|在你的 CodeLens 上调试main()功能。

CodeLens

从编辑器菜单运行

另一种开始调试的方法是从编辑器顶部标题栏选择“运行 Java调试 Java”菜单。

编辑菜单

逃避按F5

F5,调试器会自动找到项目的入口并开始调试。你也可以从VS Code侧边栏的运行和调试视图开始调试会话。更多内容请参见“VS Code 调试”。

调试单个文件

除了支持由构建工具管理的 Java 项目调试外,VS Code 还支持在没有任何项目的情况下调试单个 Java 文件。

调试会话输入

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

断点

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

断点 - 条件断点

借助表达式求值,调试器还支持条件断点。当表达式值为真时,你可以将断点设置为断点。

断点 - 数据断点

当变量变值时,调试器可能会崩溃。注意,数据断点只能在调试会话中设置。这意味着你需要先启动应用并在一个常规断点上突破。然后你可以在变量视图中选择字段并设置数据断点。

数据断点

断点 - 对数点

Java调试器也支持Logpoints。Log点允许你在不修改代码的情况下将输出发送到调试控制台。它们和断点不同,因为它们不会阻止你应用的执行流程。

断点 - 触发断点

触发断点是指一旦触发另一个断点时自动启用的断点。它们在诊断代码中仅在某个前提条件之后才发生的失败案例时非常有用。

触发断点可以通过右键点击字形边缘,选择添加触发断点,然后选择启用该断点的其他断点来设置。

表达式评估

调试器还允许你在WATCH窗口和调试控制台中评估表达式。

热码替换

调试器支持的另一个高级功能是“热代码”替换。热代码替换(HCR)是一种调试技术,Java 调试器通过调试通道将类的更改传输到另一个 Java 虚拟机(JVM)。HCR促进实验开发,促进迭代试错编码。有了这个新功能,你可以启动调试会话,在开发环境中修改 Java 文件,调试器会替换运行中的 JVM 中的代码。不需要重启,所以才叫“热”。下面是一个示例,展示了如何在VS Code中使用HCR配合Debugger for Java。

你可以使用调试设置java.debug.settings.hotCode替换控制如何触发热代码替换。可能的设置值如下:

  • 手动挡- 点击工具栏以应用更改(默认)。
  • 自动- 编译后自动应用更改。
  • 绝不- 禁用热代码替换。

阶梯滤波

步骤过滤由扩展支持,用于过滤你在调试时不想看到或通过的类型。通过这个功能,你可以配置包在你的内部进行过滤launch.json这样你通过时可以跳过。

配置选项

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

请参阅Red Hat扩展版Java™语言支持文档,以获取项目设置的帮助。

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

以下是所有可用的配置发射以及附上.关于如何写作的更多信息launch.json文件,参考调试。

发射

  • mainClass(必填)- 完全限定的类名(例如 [java module name/]com.xyz.MainApp)或程序条目的 Java 文件路径。
  • args- 传递给程序的命令行参数。用途“${command:SpecifyProgramArgs}”提示程序参数。它接受字符串或字符串数组。
  • 来源路径- 程序的额外源目录。调试器默认会从项目设置中寻找源代码。该选项允许调试器在额外的目录中寻找源代码。
  • 模块路径- JVM启动模块路径。如果未指定,调试器会自动从当前项目中解析。
    • $Auto- 自动解析当前项目的模块路径。
    • $Runtime- 当前项目“运行时”范围内的模块路径。
    • $Test- 当前项目“测试”范围内的模块路径。
    • !/路径/去/排除- 将指定的路径排除在模块路径中。
    • /path/to/附加- 将指定的路径附加到模块路径上。
  • 类路径- 用于启动JVM的类路径。如果未指定,调试器会自动从当前项目中解析。
    • $Auto- 自动解析当前项目的类路径。
    • $Runtime- 当前项目“运行时”范围内的类路径。
    • $Test- 当前项目“测试”范围内的类路径。
    • !/路径/去/排除- 将指定的路径排除在类路径之外。
    • /path/to/附加- 将指定的路径附加到类路径上。
  • 编码- 该file.encodingJVM的设置。如果未指定,则使用“UTF-8”。可能的值可在支持编码中找到。
  • vmArgs- JVM 的额外选项和系统属性(例如 -Xms<size>-Xmx<size>-D<name>=<value>),它接受字符串或字符串数组。
  • 项目名称- 调试器搜索类的首选项目。不同项目中可能存在重复的类别名称。当调试器在启动程序时寻找指定的主类时,这个设置同样有效。当工作区有多个 Java 项目时,必须这样做,否则表达式的评估和条件断点可能无法正常工作。
  • 慢性消耗病- 程序的工作目录。默认${workspaceFolder}.
  • 环境- 程序的额外环境变量。
  • envFile- 包含环境变量定义的文件的绝对路径。
  • 停止进入- 启动后自动暂停程序。
  • 控制台- 指定的启动程序控制台。如果没有指定,请使用由java.debug.settings.console用户设置。
    • 内部控制台- VS Code 调试控制台(不支持输入流)。
    • integratedTerminal- VS Code 集成终端。
    • 外部终端- 可在用户设置中配置的外部终端。
  • shortenCommandLine- 当项目的类路径或虚拟机参数较长时,启动程序的命令行可能超过作系统允许的最大命令行字符串限制。该配置项提供了多种缩短命令行的方法。默认自动.
    • 没有- 用标准命令行 'java {options} classname {args}' 启动程序。
    • JARMANIFEST- 生成临时classpath.jar文件的类路径参数,并用命令行“java -cp classpath.jar classname {args}' 启动程序。
    • argfile- 生成临时参数文件的类路径参数,并用命令行“java @argfile {args}”启动程序。该数值仅适用于 Java 9 及以上版本。
    • 自动- 自动检测命令行长度,并决定是否通过适当方法缩短命令行。
  • step滤波器- 步进时跳过指定的类或方法。
    • classNameFilters - [已弃用——被替换为skipClasses] 在步进时跳过指定的类别。职业名称应完全符合。支持万用卡。
    • skipClasses- 步进时跳过指定的类别。你可以使用内置变量如“$JDK”和“$Libraries”跳过一组类,或者添加特定的类名表达式Java。*,*.福.
    • skipSynthetics- 步进时跳过合成方法。
    • skipStaticInitializers- 步进时跳过静态初始化方法。
    • skip制造商- 跳过构建器方法时步进。

附上

  • 主机名(必需)- 远程调试器的主机名称或IP地址。
  • 港口(必需)- 远程调试设备的调试端口。
  • processID- 使用进程选择器选择要附加的进程,或将进程ID作为整数。
    • ${command:PickJavaProcess}- 使用进程选择器选择一个要附加的进程。
    • 整数PID——附加到指定的本地进程。
  • 暂停- 重新连接前的超时值,以毫秒计(默认为30000毫秒)。
  • 来源路径- 程序的额外源目录。调试器默认会从项目设置中寻找源代码。该选项允许调试器在额外的目录中寻找源代码。
  • 项目名称- 调试器搜索类的首选项目。不同项目中可能存在重复的类别名称。当工作区有多个 Java 项目时,必须这样做,否则表达式的评估和条件断点可能无法正常工作。
  • step滤波器- 步进时跳过指定的类或方法。
    • classNameFilters - [已弃用——被替换为skipClasses] 在步进时跳过指定的类别。职业名称应完全符合。支持万用卡。
    • skipClasses- 步进时跳过指定的类别。你可以使用内置变量如“$JDK”和“$Libraries”跳过一组类,或者添加特定的类名表达式Java。*,*.福.
    • skipSynthetics- 步进时跳过合成方法。
    • skipStaticInitializers- 步进时跳过静态初始化方法。
    • skip制造商- 跳过构建器方法时步进。

用户设置

  • java.debug.logLevel: 发送到 VS Code 的最低调试器日志级别,默认为警告.
  • java.debug.settings.showHex: 在变量中以十六进制格式显示数字,默认为错误.
  • java.debug.settings.showStaticVariables: 在变量中显示静态变量,默认为错误.
  • java.debug.settings.showQualifiedNames: 在变量中显示完全限定的类名,默认为错误.
  • java.debug.settings.showLogicalStructure:变量中显示集合类和映射类的逻辑结构,默认确实如此.
  • java.debug.settings.showToString: 显示所有覆盖变量中“toString”方法的类的“toString()”值,默认为确实如此.
  • java.debug.settings.maxStringLength变量或调试控制台中显示的最大字符串长度。超过此限制的弦将被修剪。默认为0,这意味着不进行修整。
  • java.debug.settings.hotCode替换:在调试时重新加载更改后的Java类,默认为手动挡.一定要确保java.autobuild.enabled对于 Java 语言支持扩展,并未被禁用。有关使用和限制的更多信息,请参见热代码替换维基页面
    • 手动作 - 点击工具栏应用更改。
    • 自动 - 编译后自动应用更改。
    • 绝不——永远不要应用这些更改。
  • java.debug.settings.enableHotCode替换: 启用 Java 代码的热代码替换。确保 VS Code Java 的自动构建没有被禁用。有关使用和限制的更多信息,请参见热代码替换维基页面
  • java.debug.settings.enable运行调试代码镜头: 启用 CodeLens 提供者,用于主入口点上的运行和调试按钮,默认为确实如此.
  • java.debug.settings.forceBuildBeforeLaunch。: 在启动 Java 程序前强制构建工作区,默认为确实如此.
  • java.debug.settings.console: 指定控制台用于启动 Java 程序,默认为integratedTerminal.如果您想为特定的调试会话定制控制台,请修改控制台配置launch.json.
    • 内部控制台- VS Code 调试控制台(不支持输入流)。
    • integratedTerminal- VS Code 集成终端。
    • 外部终端- 可在用户设置中配置的外部终端。
  • java.debug.settings.exception 断点.skipClasses:在破解异常时跳过指定的类。你可以使用内置变量如“$JDK”和“$Libraries”跳过一组类,或者添加特定的类名表达式Java。*,*.福.
  • java.debug.settings.stepping.skip类:步进时跳过指定的类别。你可以使用内置变量如“$JDK”和“$Libraries”跳过一组类,或者添加特定的类名表达式Java。*,*.福.
  • java.debug.settings.stepping.skipSynthetics:步进时跳过合成方法。
  • java.debug.settings.stepping.skipStaticInitializers:步进时跳过静态初始化方法。
  • java.debug.settings.stepping.skip构造器:步进时跳过构造器方法。
  • java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest:一次JDWP请求中可请求的最大变量或字段数。值越高,扩展变量视图时请求调试器的频率越低。而且数量较多会导致JDWP请求超时。默认是100。
  • java.debug.settings.jdwp.requestTimeout:调试器与目标JVM通信时JDWP请求的超时(毫秒)。默认是3000。
  • java.debug.settings.vmArgs:启动Java程序的默认虚拟机参数。例如,使用 '-Xmx1G -ea' 将堆大小增加到 1 GB,并启用断言。如果你想自定义某个调试会话的虚拟机参数,可以在launch.json.
  • java.silent通知: 控制是否可以用通知来报告进展。如果属实,改用状态栏报告进度。默认错误.

故障排除

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

常见问题包括:

  • Java 语言支持扩展无法启动。
  • 构建失败,你想继续吗?
  • *.java不在阶级路径上。只报告语法错误。
  • 程序错误:无法找到或加载主类X。
  • 程序抛出了 ClassNotFoundException。
  • 未能完成热代码替换。
  • 请在launch.json中注明主机名和远程调试器的端口。
  • 没能评估。原因:无法评估,因为该讨论串已继续。
  • 找不到带有主方法的职业。
  • 启动调试器时没有为 vscode.java.startDebugSession 使用delegateCommandHandler。
  • 未能解决 classpath。
  • 不支持“X”请求类型。只支持“发射”和“连接”两个功能。

反馈与问题

你可以在 vscode-java-debug 仓库找到完整的问题列表。你可以提交漏洞或功能建议,并参与社区驱动的 vscode-java-debug Gitter 频道

下一步

继续阅读,了解:

  • 调试——了解如何在VS Code中使用任何语言的调试器配合你的项目。

对于Java来说:

  • Java 测试——使用 Java Test Runner 扩展在 VS Code 内测试 Java。
  • Java 扩展——了解更多关于 VS Code 更实用的 Java 扩展。