Please enable Javascript to view the contents

VS Code中进行Java开发(4):运行和调试

 ·  ☕ 10 分钟

运行和调试

调试界面说明

debug-features_02.jpg

  • Launch/Attach(启动/附加):您可以在VS Code中启动Java项目,也可以在本地或远程以调试模式附加到任何正在运行的JVM进程。
  • Breakpoints (断点):支持按命中计数设置的条件断点,并且可以使用内联断点。这允许您在源查看器中直接将条件断点方便地添加到代码中,而无需模式窗口。还支持中断异常。
  • Control flow (控制流程) : Including Pause, Continue F5, Step over F10, Step into F11, Step out Shift+F11 (包括暂停,继续 F5,跨越 F10,跨入 F11,跨出 Shift + F11)
  • Debug Console (调试控制台):通过调试控制台,您可以查看来自stdout和stderr的信息。
  • Data inspection (数据检查) :当您在断点处停止时,调试器可以访问当前存储在内存中的变量名称和值。支持检查/监视/设置变量。
  • Diagnostics (诊断): 调用堆栈 面板显示程序的调用堆栈,并允许您浏览每个捕获分配的调用路径。并行堆栈支持多线程调试。

请确保安装了 Java Extension Pack 插件

使用

可以很容易的运行和调试 Java 应用程序,因为有多个入口可以启动调试会话。

CodeLens

CodeLens是Visual Studio Code中的流行功能。该功能的实质是在源代码中 “散布可操作的上下文链接信息” 。

一旦调试器被激活时,你会发现在你的 main() 方法上显示有 Run|DebugCodeLens

如果愿意,还可以取消 Enable Run Debug CodeLens 设置项来禁用CodeLens。在禁用CodeLens的情况下,您仍然可以通过将鼠标悬停在函数上来访问Run | Debug操作main()方法。

上下文菜单

开始调试的另一种方法是在文件资源管理器或编辑器中右键单击Java文件,然后在上下文菜单中选择**“运行”**或" **调试** “。

按 F5

单击 CodeLens 上的 Run 或 按 F5 后,调试器将自动找到项目的入口点并开始调试。还可以从"调试"菜单 由 VS Code 一侧的活动栏中的"调试"图标(🐞)打开的调试视图 启动调试会话。

debug-intro.gif

您的项目可能有多个调试配置,您始终可以添加和修改这些配置,然后选择要运行的配置。

java-debug.gif

如果项目中没有调试配置文件 launch.json,则调试器将自动寻找 main class 并生成配置以启动应用程序。VS code 将调试配置信息保存在工作区(项目根文件夹)中的 .vscode 文件夹下的launch.json 文件中,或保存在 用户设置 或 工作区设置中。有关更多详细信息,请阅读Launch configurations.。

默认情况下,Java调试器不会在工作区中持久化launch.json。如果要保存它,可以单击"调试"视图中的 “create a launch.json file” 链接,在该在这里还可以找到"调试"和"运行"按钮。

还有一个用于调试当前文件的便捷设置,编辑器知道哪个文件当前处于活动状态,然后选择它作为入口点。

current-file.gif

调试单个文件

VS Code可以运行和调试单个Java文件,而无需任何项目。

single-file-debugging.gif

调试外部文件

Java 调试器还支持外部源文件。这允许您调试位于 JAR 或源附件中的第三方类。在开始调试之前,在这些类中设置断点。您还可以使用上下文菜单 “attach source” 将缺少的源代码与 zip/jar 文件一起附加。

attach-source.gif

VS Code Java调试器也支持Java 9和更高版本。

java9.gif

Threads

您可以在调用堆栈窗格(Call Stack)中看到所有正在运行的线程,并使用上下文菜单处理单个线程。

终端交互 Debug session inputs

VS Code 中的默认调试控制台不支持输入。如果您的程序需要来自终端的输入,您可以使用 VS 代码中的集成终端 (Ctrl+') 或外部终端来启动它。

launch-in-terminal.gif

步骤筛选

步骤筛选器由扩展提供支持,可以筛选出调试时不希望看到或单步执行 (step through) 的类型。借助此功能,可以将packages 配置为在 launch.json 中进行筛选,以便在单步执行 (step through) 时跳过它们。

step-filter.gif

表达式求值

调试器还允许您在监视窗口( WATCH window)和调试控制台(Debug Console)中计算表达式。也可以使用此功能设置条件断点。

expression-evaluation.gif

目前,VS Code Java调试器使用集成终端作为默认控制台,它不支持表达式求值。为了让控制台使用此功能,您需要将控制台更改为使用 launch.json 中的内部控制台。

"console": "internalConsole"

如果希望每次启动Java程序时都使用该设置,可以使用java.debug.settings.console将其配置为全局用户设置。

条件断点

在表达式求值的帮助下,调试器还支持条件断点。当表达式的计算结果为true时,可以将断点设置为break。

conditional-bp.gif

Data Breakpoint 数据断点

当变量更改其值时,可以让调试器中断。

Hot Code 替换

调试器支持的另一个高级功能是"热代码"替换。热代码替换(HCR)是一种调试技术,Java调试器通过调试通道将新的类文件传输到另一个Java虚拟机(JVM)。HCR有助于实验开发,并促进迭代试错编码。有了这个新特性,您可以在开发环境中启动调试会话并更改Java文件,调试器将替换正在运行的JVM中的代码。不需要重新启动,这就是为什么它被称为 “Hot”。下面是如何在VS Code中使用HCR和Debugger for Java的说明

hcr.gif

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

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

Logpoints日志点

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

logpoints.gif

配置

有许多选项和设置可用于配置调试器。例如,使用启动选项(launch options)可以轻松配置当前工作目录(cwd)和环境变量。

cwd-env.gif

下面是可用于LaunchAttach的所有配置。有关如何编写launch.json 文件的详细信息,请参阅 Debugging

Launch

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

Attach

  • hostName (必需)-远程调试对象的主机名或IP地址。

  • port (必需)-远程调试对象的调试端口。

  • timeout -重新连接之前的超时值,以毫秒为单位(默认为30000毫秒)。

  • sourcePaths-程序的额外源目录。默认情况下,调试器从项目设置中查找源代码。此选项允许调试器在其他目录中查找源代码。

  • projectName-调试器在其中搜索类的首选项目。在不同的项目中可能会有重复的类名。当工作空间具有多个Java项目时,这是必需的,否则表达式求值和条件断点可能不起作用。

  • stepFilters
    

    -步进时跳过指定的类或方法。

    • classNameFilters-跨步时跳过指定的类别。类名应完全合格。支持通配符。
    • skipSynthetics -跨步时跳过合成方法。
    • skipStaticInitializers -步进时跳过静态初始化方法。
    • skipConstructors -步进时跳过构造函数方法。

User Settings用户设置

  • 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:显示所有在Variables中覆盖" toString"方法的类的" toString()“值,默认为true
  • java.debug.settings.maxStringLength:在变量调试控制台中显示的最大字符串长度。超过此限制的字符串将被修剪。默认值为0,表示不执行修剪。
  • java.debug.settings.hotCodeReplace:在调试期间重新加载更改的Java类,默认为manual。确保java.autobuild.enabled未对VSCode Java禁用。有关用法和限制的更多信息,请参见热代码替换维基页面
    • 手动-单击工具栏以应用更改。
    • 自动-编译后自动应用更改。
    • 从不-从不应用更改。
  • java.debug.settings.enableHotCodeReplace:启用Java代码的热代码替换。确保未对VS Code Java禁用自动构建。有关用法和限制的更多信息,请参见热代码替换维基页面
  • 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 -可以在用户设置中配置的外部终端

参考

在Visual Studio Code中运行和调试Java

您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录