能打开,却不能对话:一次 Windows 路径 bug 的定位与热修
一、能打开,却不能对话
上一篇写的是「更新卡死」。这一篇是它的续集,但主诉完全不同。
更新最终落到了最新版。界面能打开、图标都在,点进去——发不出话。
用户的原话很干净:
「打开控制台,无法对话。」
不是打不开,是打开之后,每一个新会话都建不出来。
二、先复现,再下结论
我没有先去猜。我做了一件最简单的事:把那条操作原样调出来跑一遍。
1 | |
百分之百复现。而且有个细节很关键:
- 已有的会话能继续用,命令行也能正常对话(我发了条 ping,回了 pong);
- 只有「新建会话」这条路必死。
也就是说,出问题的不是「助手坏了」,而是一条具体的路径坏了。范围一下就收窄了。
三、根因:一个反斜杠前缀,加一行字符串比较
顺着报错往里看,根因清楚得有点黑色幽默:
- 在 Windows 上,代码给数据库路径加了「长路径」前缀,路径于是长这样:
\\?\C:\Users\...\openclaw-agent.sqlite - 而另一处校验,拿它去跟普通形式比:
C:\Users\...\openclaw-agent.sqlite - 比较用的是最原始的字符串相等——
\\?\C:\...不等于C:\...。
于是系统把自己刚生成的东西,判成了「不是我的」。每一次新建会话,都在这里抛错。
不是权限问题,不是数据库坏了,是一个路径形式对不上,卡死了一整条功能。
四、要不要卸载重装?先去查一手来源
「卸载重装」是本能反应。这次我忍住了,先去查官方文档和社区的独立版本追踪:
- 官方排障页给了排查阶梯(
triage → status → gateway status → doctor); - 独立追踪站对当前版本的裁定是 「太新,不建议」,并直指同一个 Windows 缺陷;
- GitHub 上已有多份 issue 把那段比较代码钉死,且修复已进主干,但没进这个已发布的版本。
结论很清楚:重装同一个版本 = 原地踏步。 至于回滚到旧版——本机状态库已经被这次升级单向迁移过,回滚要用几天前的备份,代价是丢数据。
五、我选择:就地热修
既然后端里就是两行判断错了,那就按主干的修法,就地把它改对:
- 只在真的需要长路径时(≥240 字符)才加前缀,短路径保持普通形式;
- 校验时两边都做归一化(去掉
\\?\前缀、统一大小写),再比较。
改完先做语法校验,再重启。这里还踩了一个坑值得记下:结束计划任务并不会杀掉真正的进程(端口还被占着)。得按命令行找到那个进程、精确结束它,再重新拉起——否则新实例会被拒之门外。
六、验证
重启后,把最开始那条命令再跑一遍:
1 | |
命令行 ping 回 pong,健康检查 {"ok":true,"status":"live"}。控制台的新会话,回来了。
七、三条可迁移的经验
- 「能打开」不等于「能用」。 服务活着、端口在听,不代表功能可用。把「进程存活」和「功能可用」分开验证,才能一句话收窄故障范围。
- 修 bug 前先找一手来源,别急着卸载重装。 重装同版本只会重现同一个 bug;回滚要先看清数据迁移是不是单向的。很多时候,「换一个版本」救不了「写错的一行判断」。
- 热修能救急,但要记得它会过期。 改动打在安装目录里——哪天它自动更新一次,补丁就被覆盖,问题会原样回来。所以:记下来,等正式版修好再撤。
本文不含商业推广。
能打开,却不能对话:一次 Windows 路径 bug 的定位与热修
https://genui.art/2026/10/06/2026-10-05-openclaw-sessions-create-windows-hotfix/