运行和调试 Java
Visual Studio Code 允许您通过Java 调试器扩展来调试 Java 应用程序。它是一个基于 Java调试服务器的轻量级 Java 调试器,扩展了Red Hat 对 Java™ 的语言支持。
以下是支持的调试功能的列表:
- 启动/附加
- 断点
- 例外情况
- 暂停和继续
- 进入/退出/结束
- 变量
- 调用栈
- 线程数
- 调试控制台
- 评估
- 热代码替换
Java 调试器是一个开源项目,欢迎贡献者通过 GitHub 存储库进行协作:
如果您在使用以下功能时遇到任何问题,可以通过输入问题与我们联系。
安装
要在 Visual Studio Code 中获得完整的 Java 语言支持,您可以安装Java 扩展包,其中包括 Java 调试器扩展。
有关如何开始使用扩展包的详细信息,您可以查看Java 入门教程。
配置
默认情况下,调试器将通过自动查找主类并在内存中生成默认启动配置来启动应用程序来开箱即用地运行。
如果您想自定义并保留启动配置,可以在“运行和调试”视图中选择创建 launch.json 文件链接。
该launch.json
文件位于.vscode
工作区的文件夹中(项目根文件夹)。
有关如何创建的更多详细信息launch.json
,请参阅启动配置;有关 Java 配置选项的更多详细信息,您可以阅读配置选项。
运行和调试
调试器扩展提供了多种运行和调试 Java 应用程序的方法。
从 CodeLens 运行
您将在函数的CodeLens上找到“运行|调试”。main()
从编辑器菜单运行
开始调试的另一种方法是从顶部编辑器标题栏中选择“运行 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 调试器支持各种断点,例如行断点、条件断点、数据断点、日志点。
断点 - 条件断点
借助表达式求值,调试器还支持条件断点。您可以将断点设置为在表达式计算结果为 true 时中断。
断点-数据断点
当变量更改其值时,您可以让调试器中断。请注意,数据断点只能在调试会话内设置。这意味着您需要启动应用程序并首先在常规断点上中断。然后,您可以在VARIABLES视图中选择一个字段并设置数据断点。
断点 - 日志点
Java 调试器也支持日志点。日志点允许您将输出发送到调试控制台,而无需编辑代码。它们与断点不同,因为它们不会停止应用程序的执行流程。
表达评估
调试器还允许您在WATCH窗口以及调试控制台中计算表达式。
热代码替换
调试器支持的另一个高级功能是“热代码”替换。热代码替换 (HCR) 是一种调试技术,Java 调试器通过该技术将类更改通过调试通道传输到另一个 Java 虚拟机 (JVM)。HCR 促进实验开发并促进迭代试错编码。借助此新功能,您可以启动调试会话并更改开发环境中的 Java 文件,调试器将替换正在运行的 JVM 中的代码。不需要重新启动,这就是它被称为“热”的原因。下面说明了如何在 VS Code 中将 HCR 与 Debugger for Java 结合使用。
您可以使用调试设置java.debug.settings.hotCodeReplace
来控制如何触发热代码替换。可能的设置值为:
manual
- 单击工具栏应用更改(默认)。auto
- 编译后自动应用更改。never
- 禁用热代码替换。
步进过滤
扩展支持单步过滤器,可以过滤掉调试时不想看到或单步执行的类型。使用此功能,您可以配置要在您的程序中进行过滤的包launch.json
,以便在您单步执行时可以跳过它们。
配置选项
有许多选项和设置可用于配置调试器。例如,使用启动选项可以轻松配置 JVM 参数和环境变量。
请参阅Red Hat 扩展的 Java™ 语言支持文档,以获取设置项目的帮助。
对于许多常用的设置, VS Code Java 调试器配置中提供了示例。该文档解释了 Java 调试器如何自动为您生成配置,以及如果您需要修改它们,如何使用 Main 类、不同的参数、环境、附加到其他 Java 进程以及更高级功能的使用来进行修改。
Launch
以下是和可用的所有配置Attach
。有关如何编写该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
-file.encoding
JVM 的设置。如果未指定,将使用“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
:在Variables中显示静态变量,默认为false
。java.debug.settings.showQualifiedNames
:在变量中显示完全限定的类名,默认为false
.java.debug.settings.showLogicalStructure
:显示Variables中Collection和Map类的逻辑结构,默认为true
。java.debug.settings.showToString
:显示变量中覆盖“toString”方法的所有类的“toString()”值,默认为true
。java.debug.settings.maxStringLength
:变量或调试控制台中显示的字符串的最大长度。超过此限制的字符串将被修剪。默认值为0
,表示不执行修剪。java.debug.settings.hotCodeReplace
:调试时重新加载改变的Java类,默认为manual
. 确保java.autobuild.enabled
未禁用Java 语言支持扩展。有关用法和限制的更多信息, 请参阅热代码替换 wiki 页面。- 手动 - 单击工具栏以应用更改。
- auto - 编译后自动应用更改。
- 从不 - 从不应用更改。
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
. 如果您想为特定的调试会话自定义控制台,请console
修改launch.json
.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
.java.silentNotification
:控制是否可以使用通知来报告进度。如果为 true,则使用状态栏来报告进度。默认为false
.
故障排除
如果您在使用调试器时遇到问题,可以在vscode-java-debug GitHub 存储库中找到详细的故障排除指南。
解释的常见问题包括:
- Java 语言支持扩展无法启动。
- 构建失败,是否继续?
- *.java 不在类路径中。仅报告语法错误。
- 程序错误:无法找到或加载主类 X。
- 程序抛出 ClassNotFoundException。
- 无法完成热代码替换。
- 请在launch.json中指定远程调试对象的主机名和端口。
- 无法评价。原因:无法评估,因为线程已恢复。
- 找不到具有 main 方法的类。
- 启动调试器时,vscode.java.startDebugSession 没有 delegateCommandHandler。
- 无法解析类路径。
- 不支持请求类型“X”。仅支持“启动”和“附加”。
反馈和问题
您可以在vscode-java-debug存储库中找到完整的问题列表。您可以提交错误或功能建议并参与社区驱动的vscode-java-debug Gitter 频道。
下一步
继续阅读以了解:
- 调试- 了解如何在任何语言的项目中使用 VS Code 中的调试器。
对于Java: