VS Code Java 调试源码路径解析全链路剖析
项目背景本文以一个真实的 Spring Boot 调试场景为样本追踪调用堆栈渲染的完整链路定位一个隐蔽的问题launch.json 中明明配置了 sourcePaths调试时却完全不生效。样本项目是一个单模块 Maven 工程基于 Spring Boot 2.7.18Java 8。pom.xml 声明了 spring-boot-starter-web 和 spring-boot-starter-test 两个依赖artifactId 为 spring-boot-demo。项目下有一个 external 目录存放从 sources jar 解压出来的第三方源码作为只读参考区。同时项目通过类名覆盖机制在 src/main/java/org/springframework/boot/ 下放置了一份 SpringApplication.java用于局部调试 Spring Boot 启动流程。调试采用 Attach 模式目标 Spring Boot 进程以 JDWP 调试参数独立启动监听 5015 端口IDE 作为调试客户端连接上去。调试配置项目的调试行为由两份配置文件决定。settings.json 中与 Java 相关的关键配置{java.jdt.ls.vmargs:-Xmx2G -Dlog.levelALL -Dlog.protocoltrue -Djdt.ls.debugtrue,java.trace.server:verbose,java.import.generatesMetadataFilesAtProjectRoot:true,java.debug.settings.logLevel:verbose}其中 java.import.generatesMetadataFilesAtProjectRoot 设为 true使得 .classpath 文件生成在项目根目录而非 JDT 工作区数据目录便于直接查看。jdt.ls.vmargs 开启了全量日志和协议追踪为后续链路分析提供了完整的运行时日志。launch.json 的 Attach 调试配置{type:java,name:Attach to Spring Boot (5015),request:attach,hostName:localhost,port:5015,sourcePaths:[${workspaceFolder}/external/spring-boot-2.7.18-sources,${workspaceFolder}/external/spring-boot-autoconfigure-2.7.18-sources,${workspaceFolder}/external/spring-web-5.3.31-sources,${workspaceFolder}/external/spring-webmvc-5.3.31-sources,${workspaceFolder}/external/spring-beans-5.3.31-sources,${workspaceFolder}/external/spring-context-5.3.31-sources,${workspaceFolder}/external/spring-aop-5.3.31-sources,${workspaceFolder}/external/spring-core-5.3.31-sources,${workspaceFolder}/external/tomcat-embed-core-9.0.83-sources]}sourcePaths 指向 external 目录下九个解压后的源码目录期望调试时调用堆栈里第三方库的栈帧能定位到这些裸 .java 文件。实际运行中断点命中后调用堆栈输出如下DefaultApplicationArguments.init(String[]) (\spring-boot-2.7.18.jar\org.springframework.boot\DefaultApplicationArguments.java:41) SpringApplication.run(String[]) (d:\project\external\java-project\src\main\java\org\springframework\boot\SpringApplication.java:301) SpringApplication.run(Class[],String[]) (d:\project\external\java-project\src\main\java\org\springframework\boot\SpringApplication.java:1300) SpringApplication.run(Class,String[]) (d:\project\external\java-project\src\main\java\org\springframework\boot\SpringApplication.java:1289) Application.main(String[]) (d:\project\external\java-project\src\main\java\com\example\Application.java:12)问题就藏在这份堆栈里DefaultApplicationArguments 的路径指向 jar 包内部\spring-boot-2.7.18.jar…而不是 external/spring-boot-2.7.18-sources 下的源文件。sourcePaths 配了九个目录却完全没有参与路径解析。调试链路全景要理解 sourcePaths 为何失效需要先看清整条调试链路如何运转。LSP 进程启动VS Code 启动时加载 redhat.java 扩展读取 settings.json 配置随后启动 JDT Language Server 进程。启动命令的核心参数包括JRE: ...\redhat.java-1.55.0\jre\21.0.11\bin\java -Djava.import.generatesMetadataFilesAtProjectRoottrue -Xmx2G -Dlog.levelALL -Dlog.protocoltrue -javaagent:...\lombok-1.18.39.jar -jar ...\org.eclipse.equinox.launcher_1.7.200.jar -configuration ...\globalStorage\redhat.java\1.55.0\config_win -data ...\workspaceStorage\...\redhat.java\jdt_wsJDT LS 基于 Eclipse OSGi 容器运行启动时会加载一批 bundle包括 org.eclipse.jdt.coreJDT 核心、org.eclipse.m2e.coreMaven 集成、org.eclipse.jdt.ls.core语言服务器核心以及 com.microsoft.java.debug.pluginJava 调试插件。这个调试插件对应 VS Code 的 Debugger for Java 扩展vscjava.vscode-java-debug正是后续 sourcePaths 逻辑的承载者也是问题根源所在。排查过程中从 GitHub 下载了该扩展的 java-debug 源码项目进行参考研究版本为 pre-release0.59.2026072407后续会看到这份源码与实际运行的版本存在关键差异。项目导入与 classpath 生成JDT LS 收到 initialize 请求后解析 settings 中的 java.home 和 configuration.runtimes注册 JavaSE-1.8 对应的 JDK 路径。随后 ProjectManager 检测到工作区根目录下的 pom.xml选择 MavenProjectImporter 进行导入。导入过程解析 pom.xml 的依赖模型创建 Eclipse 项目设置 java nature 和 maven nature并生成 .classpath 文件。由于 generatesMetadataFilesAtProjectRoot 为 true.classpath 直接写到项目根目录。.classpath 中的关键条目kindsrc → src/main/java (源码根K_SOURCE) kindsrc → src/test/java (测试源码) kindcon → JRE_CONTAINER (JavaSE-1.8) kindcon → MAVEN2_CLASSPATH_CONTAINER (所有 Maven 依赖 jar) kindoutput → target/classes其中 src/main/java 这个源码根既包含项目自身的 com.example.Application.java也包含通过类名覆盖放进去的 org.springframework.boot.SpringApplication.java。MAVEN2_CLASSPATH_CONTAINER 则包含 spring-boot-2.7.18.jar 等所有依赖 jar每个 jar 若有对应的 sources jar会作为源码附件关联。调试会话启动用户点击调试按钮后VS Code 先发送 updateDebugSettings 命令同步调试参数随后发送 startDebugSession 命令。JDT LS 端的 JavaDebugServer 在一个空闲端口本次为 2087创建 ServerSocketVS Code 作为 DAP 客户端连接上来。连接建立后JdtProviderContextFactory 创建 ProviderContext注册一系列 Provider其中关键的是 JdtSourceLookUpProvider负责后续的源码查找。DebugAdapter 随后注册所有 DAP 请求处理器包括 AttachRequestHandler、StackTraceRequestHandler 等。AttachRequestHandler 处理 attach 请求时解析 launch.json 传入的参数随后通过 JDWP 连接到目标 JVM创建 DebugSession并将 sourcePaths 注入到 DebugAdapterContext 中。到这里sourcePaths 已经正确传入运行时上下文DAP 协议层也确认了这九个路径。断点命中与栈帧解析目标 JVM 在 Application.main 第 12 行命中断点线程暂停通过 JDWP 通知调试器。VS Code 收到 stopped 事件后发送 stackTrace 请求。StackTraceRequestHandler 的处理流程1. 通过 JDWP 获取线程引用和总帧数本次 5 帧 2. 通过 JDWP 加载栈帧列表 3. 对每个栈帧解析 JDI 元信息 - declaringType.name() → 全限定类名 - sourceName → 源文件名如 DefaultApplicationArguments.java - sourcePath → 包相对路径如 org/springframework/boot/DefaultApplicationArguments.java - lineNumber → 行号 4. 对每个栈帧调用 convertDebuggerSourceToClient 解析最终源码路径第四步的 convertDebuggerSourceToClient 是整条链路的核心也是 sourcePaths 生效与否的分水岭。源码路径解析的两条分支convertDebuggerSourceToClient 接收全限定类名、源文件名、包相对路径和上下文内部先通过 ISourceLookUpProvider 查找源码元素得到一个 URI然后根据 URI 的协议类型走不同分支。分支一file 协议直接返回当类位于项目源码根 src/main/java 中时JdtUtils.findSourceElement 会在 JavaProjectSourceContainer 的 K_SOURCE root 里找到 IResource即一个 IFile返回 file 协议的 URI。本项目里 SpringApplication.java 通过类名覆盖放在 src/main/java/org/springframework/boot/ 下属于项目源码。三个 SpringApplication 栈帧都走这条路径ISourceLookUpProvider.getSource(org.springframework.boot.SpringApplication, org/springframework/boot/SpringApplication.java) └─ JdtUtils.findSourceElement() └─ JavaProjectSourceContainer.findSourceElements() └─ 在 K_SOURCE root: src/main/java 中查找 └─ 找到 IFile → file:///d:/.../src/main/java/org/springframework/boot/SpringApplication.java uri file:///... → startsWith(file:) true → 直接返回 file:// 路径Application.java 同理它是项目自身源码也走 file 协议直接返回。这条分支不涉及 sourcePaths。分支二jdt 协议与 sourcePaths 回退当类不在项目源码根中而是来自 Maven 依赖 jar 时findSourceElement 在 K_SOURCE root 中找不到转而在 K_BINARY rootsMAVEN2_CLASSPATH_CONTAINER中查找找到的是 IClassFile编译后的 class 文件返回 jdt 协议的 URI。DefaultApplicationArguments 就是这种情况它只在 spring-boot-2.7.18.jar 中src/main/java 下没有同名覆盖ISourceLookUpProvider.getSource(org.springframework.boot.DefaultApplicationArguments, org/springframework/boot/DefaultApplicationArguments.java) └─ JdtUtils.findSourceElement() └─ JavaProjectSourceContainer.findSourceElements() ├─ 在 K_SOURCE root: src/main/java 中查找 → 未找到 └─ 在 K_BINARY roots 中查找 └─ 在 spring-boot-2.7.18.jar 中找到 IClassFile → 返回 jdt://contents/spring-boot-2.7.18.jar/...URI uri jdt://... → startsWith(file:) false此时进入关键逻辑uri 不以 file: 开头理应尝试用 sourcePaths 做回退查找。这正是 sourcePaths 配置的意义所在——当 JDT 只能找到 jar 内的 class 文件时用 sourcePaths 指向的裸源码目录兜底把 jdt:// URI 替换成 file:// 路径。sourcePaths 为何没有生效按上述设计DefaultApplicationArguments 走到 jdt:// 分支后应该触发 sourcePaths 回退逻辑resolveSourceFromSourcePaths( DefaultApplicationArguments.java, org/springframework/boot/DefaultApplicationArguments.java, context) └─ AdapterUtils.sourceLookup(context.getSourcePaths(), relativeSourcePath) └─ 遍历 9 个 sourcePaths 目录: Path fullpath Paths.get( d:/.../external/spring-boot-2.7.18-sources, org/springframework/boot/DefaultApplicationArguments.java) → 文件确实存在 → 返回完整路径 → 返回 file:// 路径调用堆栈显示 external 下的源文件但实际调用堆栈显示的是 \spring-boot-2.7.18.jar…说明 sourcePaths 回退根本没有执行。通过 Arthas 在运行时验证watch AdapterUtils.sourceLookup → 未被调用sourceLookup 从未执行 sm StackTraceRequestHandler * -d → resolveSourceFromSourcePaths 方法不存在 jad StackTraceRequestHandler.convertDebuggerSourceToClient → 反编译确认走旧版逻辑运行时加载的 java-debug 代码中convertDebuggerSourceToClient 的实际逻辑是if(!StringUtils.isBlank(uri)){if(uri.startsWith(file:)){returnnewTypes.Source(sourceName,clientPath,sourceReference);}// 直接返回 jdt:// URI完全没有 sourcePaths 回退returnnewTypes.Source(sourceName,uri,sourceReference);}// 只有 URI 为空时才走 sourceLookupStringabsoluteSourcepathAdapterUtils.sourceLookup(context.getSourcePaths(),relativeSourcePath);也就是说uri 不为空且不以 file: 开头时直接返回 jdt:// URIsourcePaths 被完全跳过。sourcePaths 只有在 URI 恰好为空时才会被使用而 JDT 几乎总能从 jar 中找到 IClassFile 并返回非空 URI导致 sourcePaths 形同虚设。根因release 版本落后于 pre-release排查过程中从 GitHub 下载了 Debugger for Java 扩展的 java-debug 源码项目进行参考研究版本为 pre-release0.59.2026072407。这份源码中convertDebuggerSourceToClient 的逻辑包含了 resolveSourceFromSourcePaths 回退if(!StringUtils.isBlank(uri)){if(uri.startsWith(file:)){returnnewTypes.Source(sourceName,clientPath,sourceReference);}else{// 先尝试 sourcePaths 回退Types.SourcesourceInSourcePathsresolveSourceFromSourcePaths(sourceName,relativeSourcePath,context);if(sourceInSourcePaths!null){returnsourceInSourcePaths;}returnnewTypes.Source(sourceName,uri,sourceReference);}}但这份源码只是参考研究对象并非调试时实际执行的代码。实际执行的是用户扩展目录中安装的 Debugger for Java 扩展VS Code 默认安装的是 release 版本。release 版本落后于 pre-release 版本其内嵌的 com.microsoft.java.debug.core-0.53.2.jar 中convertDebuggerSourceToClient 的逻辑缺少 resolveSourceFromSourcePaths 回退if(!StringUtils.isBlank(uri)){if(uri.startsWith(file:)){returnnewTypes.Source(sourceName,clientPath,sourceReference);}// 直接返回 jdt:// URI完全没有 sourcePaths 回退returnnewTypes.Source(sourceName,uri,sourceReference);}// 只有 URI 为空时才走 sourceLookupStringabsoluteSourcepathAdapterUtils.sourceLookup(context.getSourcePaths(),relativeSourcePath);两个版本的对比如下版本来源resolveSourceFromSourcePathssourcePaths 是否生效pre-release 0.59.2026072407GitHub 下载的源码项目参考研究有是release 版本VS Code 默认安装实际执行无否问题本质在于VS Code 默认使用 release 版本而 release 版本落后于 pre-release尚未包含 sourcePaths 回退的修复。排查时参考的 pre-release 源码让人误以为修复已存在但实际运行的 release 版本并没有这段逻辑。此外OSGi 缓存机制会进一步固化这个问题。JDT LS 基于 Eclipse OSGi 容器运行首次启动时会将扩展目录中的 plugin JAR 安装到 OSGi 缓存中。后续即使更新了扩展目录中的 JAR只要 bundle 版本号不变都是 0.53.2OSGi 就会复用缓存中的旧版不会重新安装。通过 StackTraceRequestHandler.class 的 SHA256 比对可以确认来源SHA256是否含修复OSGi 缓存运行时实际加载E896B36F…否pre-release 源码编译版本1F3D6403…是release 扩展目录E896B36F…否OSGi 缓存中的类与 release 版本字节级一致。这意味着即使后续把扩展切换到包含修复的版本不清除 OSGi 缓存的话运行时仍会加载旧版。修复方案问题根源在于 VS Code 默认安装的 release 版本落后于 pre-release缺少 sourcePaths 回退修复。在 VS Code 扩展面板中找到 Debugger for Java将其从 release 版本切换到 pre-release 版本即可获得包含 resolveSourceFromSourcePaths 的代码。VS Code 默认最新版使用的是 release 版本pre-release 版本包含尚未发布到 release 通道的最新修复。切换方式在扩展面板搜索 Debugger for Java点击齿轮图标选择切换到预发布版本。切换扩展版本后JDT LS 不会自动重新加载新版的 plugin JAR因为 OSGi 缓存仍持有旧版。需要配合方案二清除 OSGi 缓存确保运行时加载到 pre-release 版本的代码。修复后的预期效果修复生效后DefaultApplicationArguments 的解析路径变为uri jdt://... → 不以 file: 开头 └─ resolveSourceFromSourcePaths() └─ AdapterUtils.sourceLookup(sourcePaths, org/springframework/boot/DefaultApplicationArguments.java) └─ Paths.get(d:/.../external/spring-boot-2.7.18-sources, org/springframework/boot/DefaultApplicationArguments.java) → 文件存在 → 返回完整路径 → 返回 file:// 路径 调用堆栈显示: DefaultApplicationArguments.init(String[]) (d:\project\external\java-project\external\spring-boot-2.7.18-sources\ org\springframework\boot\DefaultApplicationArguments.java:41)此时 sourcePaths 真正参与解析调用堆栈中的第三方栈帧定位到 external 目录下的裸源码文件可在 IDE 中直接编辑、断点、查看变量。链路总结整条调试链路涉及四层协作VS Code 前端 ├─ settings.json → 控制 JDT LS 行为 └─ launch.json → 传递 sourcePaths 到 DAP 层 │ ▼ LSP 层JDT LS ├─ OSGi 容器启动 → 加载 java-debug plugin bundle ├─ Maven 项目导入 → 生成 .classpath └─ 注册 Debug 命令处理器 │ ▼ DAP 层java-debug ├─ AttachRequestHandler → 注入 sourcePaths 到上下文 └─ StackTraceRequestHandler.convertDebuggerSourceToClient ├─ ISourceLookUpProvider → JDT 查找源码元素 │ ├─ 项目源码 → file:// URI → 直接返回 │ └─ jar 内 class → jdt:// URI └─ jdt:// URI 时 → resolveSourceFromSourcePaths 回退需 pre-release 版本 ├─ pre-release遍历 sourcePaths 找到裸源码 → 返回 file:// └─ releaseOSGi 缓存固化跳过 sourcePaths → 返回 jdt:// │ ▼ JDK/JDI 层 ├─ ThreadReference.frames() → 栈帧列表 ├─ Location.declaringType() → 全限定类名 ├─ ReferenceType.sourceName() → 源文件名 └─ Location.lineNumber() → 行号sourcePaths 失效的根因不在配置而在于 VS Code 默认使用的 release 版本落后于 pre-release缺少 sourcePaths 回退逻辑OSGi 缓存机制又进一步固化了旧版代码即使更新扩展也未必加载新版。这类问题的隐蔽之处在于配置层面一切正常参考的 pre-release 源码也显示修复已存在但实际运行的 release 版本并没有这段逻辑只有深入到运行时字节码层面才能发现参考源码与实际执行代码并非同一份。

相关新闻

Unity实时视频制作全流程:从Timeline编排到影视级渲染输出

Unity实时视频制作全流程:从Timeline编排到影视级渲染输出

1. 项目概述:为什么要在Unity里做视频?你可能觉得Unity就是个做游戏的引擎,跟视频制作八竿子打不着。但如果你尝试过用传统剪辑软件去合成一段带有复杂三维动画、实时粒子特效或者需要与虚拟场景精确交互的视频,就会明白那种“隔靴…

2026/10/17 9:15:26 阅读更多 →
Spring @Profile注解详解:环境隔离与条件装配

Spring @Profile注解详解:环境隔离与条件装配

1. 为什么需要Profile注解?在Spring应用开发中,我们经常遇到这样的场景:某些功能在开发环境(dev)需要启用,但在生产环境(prod)必须禁用。比如:开发环境需要打印详细日志,生产环境则只记录错误日志开发环境需…

2026/10/19 0:40:49 阅读更多 →
英雄联盟海斗模式录播学习法:从高手对局中系统提升游戏技术

英雄联盟海斗模式录播学习法:从高手对局中系统提升游戏技术

如果你是一名《英雄联盟》玩家,尤其是主打电一艾欧尼亚的“海斗”模式爱好者,最近可能被一个现象刷屏了:顶尖主播的“录播”切片,正以惊人的速度成为玩家们学习技术、研究版本、甚至规划上分路径的“硬核教材”。这不仅仅是“看个…

2026/10/18 13:18:19 阅读更多 →

最新新闻

Linux账号与权限管理实战:从用户规划到事故排障全解析

Linux账号与权限管理实战:从用户规划到事故排障全解析

我刚接手服务器运维时遇到的第一起事故,至今印象很深。那天业务方反馈内部管理后台登录不上,我看了一下,不是密码错,而是系统直接提示账户被锁定。当时第一反应是去改密码,改完依然进不去,后来才发现是账户…

2026/10/19 7:40:22 阅读更多 →
STM32自动浇花系统源码解析:从土壤湿度采集到水泵控制与Flash阈值存储

STM32自动浇花系统源码解析:从土壤湿度采集到水泵控制与Flash阈值存储

简介:STM32自动浇花系统是一套面向嵌入式初学者与电子爱好者的完整智能硬件实践项目,以STM32F103C8T6为核心,结合土壤温湿度、光敏、空气温湿度等传感器与OLED显示、DC-DC电源、水泵控制模块,实现按湿度阈值或定时策略自动灌溉&am…

2026/10/19 7:40:22 阅读更多 →
内核空间初始化:从引导程序到start_kernel的完整流程解析

内核空间初始化:从引导程序到start_kernel的完整流程解析

1. 内核空间初始化的整体蓝图1.1 初始化到底在做什么很多做应用开发的同事一听到"内核空间初始化",第一反应是"那不就是开机跑一段汇编把硬件摸一遍嘛"。这个理解不算错,但跟实际的内核初始化工作相比,显得太过乐观了。我…

2026/10/19 7:40:22 阅读更多 →
升维与降维互为因果:构建永续认知螺旋

升维与降维互为因果:构建永续认知螺旋

先说一个我最近的经历。某个产品功能上线不到两周,数据就出现明显下滑,团队开会复盘时,现场出现了两种截然不同的声音:一种说,要想清楚这个功能到底在服务谁、解决什么问题,别让短期指标牵着走;…

2026/10/19 7:40:21 阅读更多 →
RAG落地实战:检索增强生成的原理、架构与参数调优全解析

RAG落地实战:检索增强生成的原理、架构与参数调优全解析

最近大模型圈子里最绕不开的一个词就是RAG(Retrieval-Augmented Generation,检索增强生成)。不管是做知识库问答、企业私有数据助手,还是给大模型配上"长期记忆",背后基本都是这套架构。我自己在过去一段时间…

2026/10/19 7:40:21 阅读更多 →
把Claude当成AI同事:一套减少返工的高效工作流搭建指南

把Claude当成AI同事:一套减少返工的高效工作流搭建指南

1. 为什么我决定把 Claude 当成"同事"而不是"搜索框"1.1 一个月的试验是怎么开始的事情要从上个月说起。那段时间我手头同时压着三个项目:一个老活动的复盘报告还没交,一个新上线的功能要赶推广方案,还有日常的周报、邮件…

2026/10/19 7:39:21 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →