尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Debugger for Java 全配置属性盘点

Debugger for Java 全配置属性盘点 VSCode 生态中由 Microsoft 出品的 Debugger for Java 扩展是 Java 开发者日常调试的核心工具。它基于 Java Debug Server 与 Eclipse JDT 配合通过 DAPDebug Adapter Protocol将完整的 Java 调试能力接入 VSCode支持启动调试、附加调试、断点、异常断点、热替换、表达式求值、步骤过滤等丰富特性。该扩展的配置体系由两部分组成一是写入launch.json的调试会话级配置二是写入settings.json的全局用户设置。本文基于 vscode-java-debug-main 项目与 java-debug-main 项目的源码按扩展激活、启动调试、附加调试、调试会话运行、配置热更新五大主流程逐一盘点全部可配置属性并描述各属性在流程中的行为逻辑帮助开发者精准驾驭每一个配置项。配置属性总览Debugger for Java 的全部配置属性分布在两个位置扩展package.json中contributes.configuration节点定义了用户级设置java.debug.settings.*与java.silentNotification共 27 项contributes.debuggers[0].configurationAttributes节点定义了launch.json中launch与attach两种请求类型的会话级配置。下文按流程顺序逐一列出全部属性包括属性名、类型、默认值及功能说明。用户设置全量列表属性名类型默认值说明java.debug.logLevelenum: error, warn, info, verbosewarn调试器发送到 VSCode 的最低日志级别java.silentNotificationbooleanfalse是否使用状态栏而非通知来报告进度java.debug.settings.showHexbooleanfalse变量视图中是否以十六进制显示数值java.debug.settings.showStaticVariablesbooleanfalse变量视图中是否显示静态变量java.debug.settings.showQualifiedNamesbooleanfalse变量视图中是否显示类全限定名java.debug.settings.showLogicalStructurebooleantrue变量视图中是否显示Collection与Map的逻辑结构java.debug.settings.showToStringbooleantrue变量视图中是否显示重写toString方法的类的toString()值java.debug.settings.maxStringLengthnumber0变量视图或调试控制台中字符串的最大显示长度0表示不截断java.debug.settings.numericPrecisionnumber0格式化double时的精度0表示默认精度java.debug.settings.hotCodeReplaceenum: auto, manual, nevermanual调试期间重新加载已更改 Java 类的方式java.debug.settings.enableRunDebugCodeLensbooleantrue是否在main方法上启用Run与DebugCodeLensjava.debug.settings.forceBuildBeforeLaunchbooleantrue启动 Java 程序前是否强制编译工作空间java.debug.settings.onBuildFailureProceedbooleanfalse构建失败时是否直接继续启动java.debug.settings.consoleenum: internalConsole, integratedTerminal, externalTerminalintegratedTerminal启动 Java 程序的默认控制台java.debug.settings.vmArgsstring启动 Java 程序的默认 VM 参数java.debug.settings.exceptionBreakpoint.exceptionTypesarray[]要中断的异常类型列表java.debug.settings.exceptionBreakpoint.allowClassesarray[]允许异常断点中断的类位置支持通配符java.debug.settings.exceptionBreakpoint.skipClassesarray[]异常断点触发时跳过的类支持内置变量与通配符java.debug.settings.stepping.skipClassesarray[]步骤时跳过的类支持内置变量与通配符java.debug.settings.stepping.skipSyntheticsbooleanfalse步骤时是否跳过合成方法java.debug.settings.stepping.skipStaticInitializersbooleanfalse步骤时是否跳过静态初始化方法java.debug.settings.stepping.skipConstructorsbooleanfalse步骤时是否跳过构造函数java.debug.settings.jdwp.limitOfVariablesPerJdwpRequestnumber100单次 JDWP 请求可请求的变量或字段最大数量最小值1java.debug.settings.jdwp.requestTimeoutnumber3000JDWP 请求超时时间毫秒最小值100java.debug.settings.jdwp.asyncenum: auto, on, offauto是否允许调试器异步发送 JDWP 命令java.debug.settings.debugSupportOnDecompiledSourceenum: on, offon是否在反编译源码上启用调试支持java.debug.settings.suspendAllThreadsbooleanfalse命中断点或异常停止时是否暂停所有线程仅对新会话生效launch.json 配置全量列表属性名类型默认值适用请求说明mainClassstringlaunch程序入口主类全限定名、模块名前缀形式或 Java 文件路径必填projectNamestringlaunch/attach调试器搜索类时的首选工程名表达式求值依赖此配置javaExecstringlaunch启动程序使用的java可执行文件路径argsarray | stringlaunch传递给程序的命令行参数vmArgsarray | stringlaunchJVM 启动参数与系统属性modulePathsarray[]launch模块路径支持$Auto、$Runtime、$Test、!pathclassPathsarray[]launch类路径支持$Auto、$Runtime、$Test、!pathsourcePathsarray[]launch/attach额外的源码目录encodingstringUTF-8launchJVM 的file.encoding设置cwdstring${workspaceFolder}launch程序的工作目录envobject{}launch程序的环境变量envFilearray | string${workspaceFolder}/.envlaunch环境变量定义文件路径stopOnEntrybooleantruelaunch启动后是否自动暂停程序consoleenum: internalConsole, integratedTerminal, externalTerminalintegratedTerminallaunch启动程序使用的控制台类型shortenCommandLineenum: none, jarmanifest, argfile, autoautolaunch命令行过长时的缩短策略stepFiltersobject见子属性launch/attach步骤跳过的类或方法过滤器hostNamestringlocalhostattach远程调试进程的主机名或 IP 地址portnumber | string-attach远程调试进程的调试端口processIdenum: ${command:PickJavaProcess} | integer-attach本地进程 ID 或进程选择器timeoutnumber30000attach重新连接前的超时时间毫秒stepFilters 子属性与类路径变量子属性名类型默认值说明skipClassesarray[$JDK, junit.*]步骤时跳过的类支持内置变量与通配符skipSyntheticsbooleanfalse是否跳过合成方法skipStaticInitializersbooleanfalse是否跳过静态初始化方法skipConstructorsbooleanfalse是否跳过构造函数变量含义$Auto自动从当前工程解析对应作用域路径$Runtime当前工程runtime作用域路径$Test当前工程test作用域路径!path从解析结果中排除指定路径扩展激活与运行入口准备流程扩展在用户打开 Java 文件、初始化调试配置、执行SpecifyProgramArgs或PickJavaProcess命令等事件触发时激活。激活后首先获取 Java 语言服务器 API由于调试功能依赖语言服务器处于标准模式若检测到当前处于轻量模式会弹出对话框询问是否切换到标准模式若处于混合模式则订阅模式变更事件等待标准服务器就绪后继续等待期间进度报告器会显示导入项目的提示。语言服务器就绪后扩展根据java.debug.settings.enableRunDebugCodeLens决定main方法的运行入口形式若为true则在main方法上方注册 CodeLens显示Run与Debug两个可点击按钮若为false则改为注册悬停提示仅在鼠标悬停于main方法时显示运行入口链接。该配置在调试会话期间变更时扩展会动态销毁旧的提供者并注册新的提供者无需重启 VSCode 即可生效。扩展在构建、启动、附加等耗时操作期间会通过进度报告器显示进度。java.silentNotification影响所有进度报告器的显示位置若为true则原本显示在通知位置的进度会降级到窗口状态栏左侧显示一个带旋转图标和任务名的状态栏项点击可跳转到 Java 构建状态详情若为false则使用 VSCode 原生的通知进度条。该配置在每次创建新的进度报告器时都会重新读取因此运行时变更可立即对后续操作生效。java.debug.settings.hotCodeReplace在扩展启动时初始化热代码替换功能。该配置会被映射为一个上下文键与调试工具栏菜单的可见性条件配合决定热替换按钮是否显示。仅当值为manual且当前处于调试模式非运行模式时按钮才会显示值为auto时按钮不显示但会自动应用类变更值为never时按钮完全不显示且不处理类变更。扩展还会监听调试会话的启动与切换事件动态更新该上下文键确保运行模式下不显示热替换按钮。启动调试流程当用户通过 F5、CodeLens、右键菜单或launch.json触发调试时VSCode 会依次调用配置提供器的两个解析方法。第一个方法负责在缺少配置时生成内存中的默认配置若传入的配置是空对象仅包含是否运行模式的字段则生成一个临时配置类型设为java名称设为Java Debug请求类型设为launch并标记为调试器内部生成。第二个方法是请求处理的核心首先合并平台特定配置节然后根据request字段进入launch或attach两个分支launch分支按严格顺序执行主类校验、构建、参数合并、类路径解析、命令行缩短决策、程序启动等子流程attach分支与launch分支有部分子流程相同差异在下一节说明。本节先讲launch分支的完整子流程各子流程以段落形式依次说明。请求处理开始时首先合并平台特定的配置节这一子流程对launch与attach两个分支都会执行。launch.json中可以针对windows、linux、osx分别配置不同的属性流程会根据当前操作系统选择对应的平台节将其所有键值覆盖到全局配置对象中然后清除平台节字段。这一设计简化了后续解析逻辑无需再关心平台差异。主类解析是启动流程中最复杂的环节。若mainClass已显式配置且不是文件路径则向语言服务器校验主类与projectName的有效性校验返回主类与项目名各自的合法性标志若任一不合法且存在修复建议会弹出错误对话框提供Fix按钮点击后展示候选项供用户选择选中的主类与项目名会被持久化回launch.json若无修复建议则抛出用户错误终止流程。若mainClass为空或为文件路径则尝试将其作为文件路径解析主方法若该文件无可执行主方法则回退到最近使用的启动配置扩展会在每次成功启动后记录最近使用的主类、项目名与工作区文件夹若仍无可用配置则向用户展示主类选择列表。这一机制使得用户在当前编辑的 Java 文件没有main方法时也能智能回退到上次启动的配置。主类解析完成后若java.debug.settings.forceBuildBeforeLaunch为true则触发工作空间构建。构建委托给语言服务器执行返回状态分为成功、失败、有错误、已取消、Gradle 构建服务编译错误五种。若返回已取消或进度报告器被取消则终止启动若返回成功则继续其他状态进入构建失败处理流程。失败处理的行为由java.debug.settings.onBuildFailureProceed决定若为true直接继续启动不弹任何对话框若为false则先扫描所有打开文件的诊断信息统计 Java 错误的类型与数量若检测到错误且构建状态不是 Gradle 构建服务编译错误则自动打开 PROBLEMS 面板因为 Gradle 构建服务项目的错误不会出现在 PROBLEMS 中。随后弹出错误对话框提供三个选项Continue仅本次继续Always Continue永久继续并自动将onBuildFailureProceed写入为trueFix...弹出修复建议菜单包含清理工作区缓存、更新项目配置、打开日志文件、查看故障排除指南四项。为避免构建过快导致用户看不到编译中提示若构建耗时小于 150 毫秒会额外延迟 150 毫秒再处理结果。构建通过后进入环境变量合并阶段。流程以env配置为基础若envFile为字符串则解析该文件并合并若为数组则遍历所有文件依次合并。文件解析使用 dotenv 库并会自动剥离文件开头的 BOM 头。若文件不存在或解析失败抛出用户错误提示无法加载环境文件。最终合并结果写回env字段。VM 参数合并时launch.json中的vmArgs优先级高于java.debug.settings.vmArgs。流程检测vmArgs是否严格等于undefined而非空字符串若为undefined则回退到全局设置的vmArgs这意味着用户在launch.json中将vmArgs显式设为空字符串时不会回退到全局设置。vmArgs与args都支持字符串与字符串数组两种形式若为数组则拼接为字符串拼接时对包含空格或双引号的参数进行转义并用双引号包裹。流程还会自动追加两类有益的 VM 参数若语言服务器检测到项目启用了预览特性则自动追加--enable-preview并校验目标运行时版本兼容性若目标 JVM 版本大于等于 14则自动追加-XX:ShowCodeDetailsInExceptionMessagesJEP-358提供详细的空指针异常信息但若用户已在vmArgs中包含此参数则不重复追加。控制台选择的优先级为launch.json的console大于java.debug.settings.console大于默认值integratedTerminal。流程检测console是否为 falsy 值包括空字符串若为 falsy 则回退到全局设置。控制台选定后还有两项联动若为integratedTerminal且未显式配置调试控制台选项则自动设为不自动打开避免调试启动时焦点被切换到调试控制台若为internalConsole且未显式配置encoding则自动将encoding设为UTF-8因为 VSCode 调试控制台默认使用 UTF-8 显示输出。类路径解析分两种情况若classPaths与modulePaths均为空则让语言服务器自动解析返回的模块路径与类路径分别赋值给对应字段若任一非空则对每个非空数组进行变量替换与排除处理。变量替换处理$Auto、$Runtime、$Test三种变量若包含$Test则作用域为测试若包含$Auto则作用域为自动若仅包含$Runtime则作用域为运行时然后向语言服务器请求该作用域的路径并替换变量位置替换仅发生一次以避免重复。!path排除项会被收集起来区分文件与目录两种排除方式文件采用精确匹配目录采用前缀匹配最终从结果中过滤掉被排除的路径。若路径非绝对路径会拼接工作区文件夹路径后再规范化。若最终类路径与模块路径均为空则抛出用户错误提示用户在launch.json中手动指定。Java 可执行文件与工作目录处理阶段若javaExec为空则让语言服务器根据项目 JDK 解析java可执行文件路径若非空则校验文件是否存在不存在则抛出用户错误。cwd若未配置则回退到工作区文件夹路径。args与vmArgs若为数组则拼接为字符串。此阶段还会填充stepFilters该子流程对launch与attach两个分支都会执行若该字段不存在则直接跳过若存在则对其中的skipClasses进行变量替换仅当包含$JDK或$Libraries时才向语言服务器请求展开为具体的类名列表否则直接透传。该步骤还兼容旧版的classNameFilters字段将其合并到skipClasses后清除实现平滑迁移。命令行缩短决策阶段若shortenCommandLine未配置或为auto则自动决策。决策分两步首先根据目标 JVM 版本选择推荐方案JDK 8 及以下推荐jarmanifest生成临时classpath.jarJDK 9 及以上推荐argfile生成临时argfile然后判断是否真的需要缩短。是否需要缩短因控制台类型而异对于internalConsole需要向语言服务器查询实际命令行长度再与各平台的最大命令行长度阈值比较Windows 约为 30000 字符macOS 约为 260000 字符减去环境长度Linux 约为 2097000 字符减去环境长度同时还要校验单个类路径长度是否超过 Linux 的参数最大长度限制对于终端类控制台integratedTerminal或externalTerminal只要类路径或模块路径条目数大于 1 就启用缩短因为终端启动命令本身的长度限制更严格。环境长度计算会遍历env中所有键值对累加键长度、值长度与分隔符长度。若所有检测均不需要缩短则使用标准命令行启动。流程最后清理内部临时字段并返回最终配置。若配置来源为内部生成或launch.json且主类解析成功则将配置的副本保存为最近使用的启动配置记录主类、项目名与工作区文件夹供下次启动时智能回退使用。随后调试适配器使用javaExec解析出的java路径执行程序按console类型选择启动方式integratedTerminal在集成终端中启动并支持标准输入交互externalTerminal在外部终端窗口中启动internalConsole在调试控制台中启动但不支持标准输入。程序启动后若stopOnEntry为true则立即在主方法入口处暂停。附加调试流程附加调试流程进入request为attach的分支。该分支与launch分支共享平台属性合并与步骤过滤器填充两个子流程处理逻辑完全一致此处不再重复。本节仅说明attach分支特有的部分。attach支持两种附加方式通过hostName加port直连远程调试端口或通过processId附加到本地 Java 进程。若hostName与port同时存在且port为合法整数则进入直连模式。流程会将port转换为数字类型并清除processId字段避免后续混淆。这一模式适用于已知远程调试端口的场景如远程服务器、Docker 容器、嵌入式设备等。若processId已配置则进入进程选择模式。首先检测processId是否为${command:PickJavaProcess}若是则终止本次解析交由 VSCode 的进程选择器命令处理用户在弹出的列表中选择目标 Java 进程后会再次触发解析若为数字则查询该进程的调试端口信息若查询不到或该进程未启用调试模式则弹出错误提示并终止。查询成功后清除processId将hostName设为localhostport设为查询到的调试端口。若hostName、port、processId均未配置则抛出用户错误提示用户在launch.json中指定。timeout控制附加连接的超时时间默认 30000 毫秒。在附加调试的实际执行阶段调试适配器会发送一个测试 JDWP 请求测量网络延迟并将延迟值存储到调试上下文中。该延迟值会记录到日志中并作为java.debug.settings.jdwp.async的auto模式决策依据。调试会话运行流程调试会话启动后配置属性的影响从启动阶段转入运行阶段。这一阶段的属性主要影响断点、步骤、变量查看、热替换等运行时行为且大部分支持热更新无需重启会话即可生效。java.debug.settings.suspendAllThreads是一个具有会话级固化特性的配置。调试会话在创建时会读取该配置并固化存储此后整个调试会话期间不再读取该配置这意味着运行时修改该配置不会影响当前会话仅对下一次启动的调试会话生效。该值会传递给所有断点、观察点、异常断点的暂停策略当值为true时命中断点或异常时暂停所有线程当为false时仅暂停触发事件的线程。由于该值在会话启动时固化配置说明中明确指出仅对新调试会话生效。java.debug.settings.debugSupportOnDecompiledSource控制对反编译源码的调试支持。当调试器需要解析非文件 URI如 JDT 内部的类文件 URI的源码时会先尝试从类文件本身获取源码范围若类文件自带源码信息则直接使用该信息解析为抽象语法树若类文件没有源码信息且此配置为on则通过内容提供者调用反编译器获取源码内容再交给解析器处理。反编译路径会根据类文件所属的 Java 项目决定解析环境若类文件有对应的 Java 项目则使用该项目的编译环境否则使用空环境并显式指定编译器选项源码级别、目标平台、合规级别、预览特性启用。由于反编译需要额外加载反编译器并解析源码该功能可能影响调用栈视图的加载速度。当配置为off时无源码的类文件将无法在源码视图中显示调用栈中对应帧也无法进行源码级调试。异常断点的行为由exceptionBreakpoint.exceptionTypes、allowClasses、skipClasses三个配置共同决定。异常断点处理器在首次处理请求时从 VSCode 的过滤器参数中提取已捕获异常与未捕获异常两个勾选标志并注册调试设置变更监听。当三个异常断点配置中任一发生变更时前端会设置一个异常过滤器已更新标志发送给服务端监听器检测到该标志后才会重新设置异常断点避免无关配置变更触发昂贵的断点重建。异常断点的设置逻辑分两种情况当exceptionTypes为空时创建一个针对所有异常的断点请求并将allowClasses作为类包含过滤器、skipClasses作为类排除过滤器应用到该请求当exceptionTypes非空时对每个异常类型分别处理先创建类加载监听请求监听该类型的未来类加载在类加载时动态创建对应的异常断点同时遍历已加载的同类类立即创建断点。这种设计支持了对尚未加载的异常类型的断点能力。skipClasses中的$JDK与$Libraries变量会由前端展开为具体的类名列表后再传递给服务端。步骤执行由stepping.skipClasses、skipSynthetics、skipStaticInitializers、skipConstructors四个配置共同控制。skipClasses中的$JDK与$Libraries变量同样会在前端展开为具体类名列表展开后的过滤器发送给服务端存储。当用户执行步入或步出时会将skipClasses作为类排除过滤器应用到步骤请求中。skipSynthetics、skipStaticInitializers、skipConstructors三个布尔标志则在步骤事件触发时判断是否跳过若步骤事件发生在合成方法、静态初始化方法或构造函数中且对应标志为true则自动继续执行下一步而不暂停。步过操作不应用类过滤器因为其语义是同一方法内的行级跳转。变量视图的显示由showHex、showQualifiedNames、showStaticVariables、showLogicalStructure、showToString、maxStringLength、numericPrecision七个配置共同控制。showStaticVariables决定是否列出静态变量仅当该值为true且当前栈帧所在方法为静态方法时才会列出静态变量对于非静态方法的栈帧静态变量通过this对象的字段展示。当启用异步 JDWP 时静态变量的获取会切换为异步拉取。showLogicalStructure与showToString受异步 JDWP 状态联动影响仅当未启用异步 JDWP或虽启用异步但 JDWP 延迟低于可用阈值且对应配置为true时才真正启用逻辑结构视图或toString视图。这一机制避免在高延迟网络下因发起大量 JDWP 请求而拖慢变量视图响应。showHex、showQualifiedNames、maxStringLength、numericPrecision由变量格式化器在格式化变量值时读取分别控制数值的进制、类名的显示形式、字符串的截断长度、double的格式化精度。这五个布尔开关还通过上下文键驱动右键菜单的显示状态。扩展会将每个配置值映射为开关上下文键与菜单的可见性条件配合实现Show as Hex与Show as Dec等互斥菜单项的动态切换。当用户通过右键菜单切换某项时扩展会根据配置的当前作用域工作区文件夹、工作区、全局选择合适的写入位置更新settings.json然后立即刷新变量视图无需重启调试会话。此外VSCode 内置的debug.autoExpandLazyVariables配置控制懒展开变量扩展在切换该配置时会强制将showToString设为true因为懒展开变量依赖toString视图机制才能工作。java.debug.settings.jdwp.async的auto模式基于网络延迟自动决策若配置为on则始终启用异步若为off则始终禁用若为auto则仅当 JDWP 网络延迟超过 15 毫秒时才启用异步。该延迟值在附加调试时通过发送测试请求测量得出。设计考量是以 1 秒作为调试适配协议请求的可接受延迟单线程策略下每条 JDWP 请求约 15 毫秒延迟可保证响应性1 秒内可发送约 66 条 JDWP 请求足以覆盖断点、线程、调用栈、步骤、继续等大部分操作超过此延迟时切换为多线程异步模式通过工作窃取线程池并发执行 JDWP 请求以提升远程调试响应速度。异步模式启用后变量获取会切换为异步版本通过并发拉取局部变量、this变量与静态变量。但异步模式会禁用逻辑结构视图与toString视图除非延迟低于阈值因为这两个特性需要发起大量 JDWP 请求在异步并发下可能导致请求顺序问题。java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest控制单次 JDWP 请求的变量分页大小。在批量获取字段值或局部变量值时会按此值对字段列表分页每页调用一次批量获取。当一次性传递的变量数量过大时JDI 可能抛出超时异常因此采用分页方式分块拉取。值越大则展开变量视图时请求 debuggee 的频率越低但同时也越容易触发 JDWP 请求超时。java.debug.settings.jdwp.requestTimeout控制 JDWP 请求的超时时间。前端在发送设置更新时会强制将limitOfVariablesPerJdwpRequest与 1 取最大值、将requestTimeout与 100 取最大值避免用户配置出无效值。java.debug.settings.hotCodeReplace的三种模式在运行时构成一个状态机由前端与服务端协同实现。服务端根据配置决定是否注册资源变更监听仅当模式不为never时才监听构建后事件never模式下完全跳过资源变更监听以避免不必要的开销。当监听到类文件变更时服务端提取变更的类文件路径并发布热替换事件由处理器转换为调试适配协议事件发送给前端。前端处理两类事件当收到构建完成事件且配置为auto时自动应用类变更并在状态栏显示应用代码变更进度当配置为manual时前端仅展示工具栏按钮等待用户点击后触发应用当配置为never时按钮不显示且不处理构建完成事件。当热替换失败时前端会检查失败消息是否在已抑制原因集合中若不在则弹出对话框询问是否重启调试会话提供重启、不重启、不再提示将该失败消息加入已抑制集合后续相同失败不再提示三个选项。该集合在调试会话终止时清空确保下次调试会话重新提示。配置热更新流程Debugger for Java 的配置传递分为启动时传递与运行时热更新两条路径。启动时launch.json配置通过启动调试流程完整解析后传递给调试适配器运行时java.debug.settings.*配置通过设置更新命令序列化为 JSON 发送给语言服务器。java.debug.logLevel在传递给服务端前会从通用日志级别转换为 Java 日志级别verbose转为精细级别warn转为警告级别error转为严重级别info转为信息级别其他值默认转为精细级别。转换后的级别会随其他设置一起发送给服务端控制调试器日志的输出阈值。配置提供器在构造时会注册配置变更监听器当java.debug.*配置发生变更时执行热更新决策。决策逻辑为若当前存在活动调试会话则立即发送设置更新进行热更新并清除脏标记若不存在活动调试会话则仅设置脏标记在下一次启动调试时统一同步。设置更新函数会从java.debug配置节读取所有设置构建包含步骤过滤器、异常过滤器、异常过滤器更新标志、JDWP 分页大小、JDWP 超时、异步模式、日志级别、Java 主目录等字段的 JSON 对象发送给服务端。其中步骤过滤器与异常过滤器的skipClasses会经过变量替换异常过滤器更新标志根据变更事件是否影响异常断点三项配置来计算JDWP 分页大小与超时会与最小值取最大值。若发送失败仅记录警告日志不阻塞调试会话。配置的覆盖优先级遵循 VSCode 标准层次文件夹级大于工作区级大于用户级大于默认值。launch.json中的配置优先级高于java.debug.settings.*全局设置这一规则在vmArgs与console等属性的回退逻辑中均有体现。当用户通过右键菜单修改变量视图配置时扩展会检测该配置的当前作用域若已存在工作区文件夹级值则更新到工作区文件夹级若已存在工作区级值则更新到工作区级否则更新到全局级确保变更写入与当前生效作用域一致的位置。配置最佳实践对于远程调试场景建议将java.debug.settings.jdwp.async设为on以提升高延迟网络下的响应速度同时适当增大jdwp.requestTimeout避免超时对于变量较多的复杂对象可调整jdwp.limitOfVariablesPerJdwpRequest在请求频率与超时风险之间取得平衡。对于多线程调试场景若需要观察其他线程状态可将java.debug.settings.suspendAllThreads设为true但需注意该配置仅对新会话生效且会显著增加断点命中时的暂停开销。对于大型项目若频繁遇到命令行过长导致的启动失败可显式将shortenCommandLine设为argfileJDK 9或jarmanifestJDK 8以绕过auto模式的检测延迟若构建失败提示打扰开发节奏可将onBuildFailureProceed设为true直接跳过构建失败提示。对于反编译源码调试若调用栈视图加载明显变慢可尝试将java.debug.settings.debugSupportOnDecompiledSource设为off关闭反编译回退仅对自带源码的类文件提供源码级调试。对于团队协作推荐将统一的vmArgs、console、stepFilters配置写入.vscode/settings.json共享会话级配置则在launch.json中按需覆盖确保团队调试体验一致。
返回列表