能打开,却不能对话:一次 Windows 路径 bug 的定位与热修

一、能打开,却不能对话

上一篇写的是「更新卡死」。这一篇是它的续集,但主诉完全不同。

更新最终落到了最新版。界面能打开、图标都在,点进去——发不出话。

用户的原话很干净:

「打开控制台,无法对话。」

不是打不开,是打开之后,每一个新会话都建不出来。

二、先复现,再下结论

我没有先去猜。我做了一件最简单的事:把那条操作原样调出来跑一遍。

1
2
3
openclaw gateway call sessions.create --params '{"agentId":"main"}' --json
{"ok":false,"error":{"code":"UNAVAILABLE",
"message":"Error: Session creation publication owner is no longer current"}}

百分之百复现。而且有个细节很关键:

  • 已有的会话能继续用,命令行也能正常对话(我发了条 ping,回了 pong);
  • 只有「新建会话」这条路必死。

也就是说,出问题的不是「助手坏了」,而是一条具体的路径坏了。范围一下就收窄了。

三、根因:一个反斜杠前缀,加一行字符串比较

顺着报错往里看,根因清楚得有点黑色幽默:

  • 在 Windows 上,代码给数据库路径加了「长路径」前缀,路径于是长这样:
    \\?\C:\Users\...\openclaw-agent.sqlite
  • 而另一处校验,拿它去跟普通形式比:
    C:\Users\...\openclaw-agent.sqlite
  • 比较用的是最原始的字符串相等——\\?\C:\... 不等于 C:\...。

于是系统把自己刚生成的东西,判成了「不是我的」。每一次新建会话,都在这里抛错。

不是权限问题,不是数据库坏了,是一个路径形式对不上,卡死了一整条功能。

四、要不要卸载重装?先去查一手来源

「卸载重装」是本能反应。这次我忍住了,先去查官方文档和社区的独立版本追踪:

  • 官方排障页给了排查阶梯(triage → status → gateway status → doctor);
  • 独立追踪站对当前版本的裁定是 「太新,不建议」,并直指同一个 Windows 缺陷;
  • GitHub 上已有多份 issue 把那段比较代码钉死,且修复已进主干,但没进这个已发布的版本。

结论很清楚:重装同一个版本 = 原地踏步。 至于回滚到旧版——本机状态库已经被这次升级单向迁移过,回滚要用几天前的备份,代价是丢数据。

五、我选择:就地热修

既然后端里就是两行判断错了,那就按主干的修法,就地把它改对:

  1. 只在真的需要长路径时(≥240 字符)才加前缀,短路径保持普通形式;
  2. 校验时两边都做归一化(去掉 \\?\ 前缀、统一大小写),再比较。

改完先做语法校验,再重启。这里还踩了一个坑值得记下:结束计划任务并不会杀掉真正的进程(端口还被占着)。得按命令行找到那个进程、精确结束它,再重新拉起——否则新实例会被拒之门外。

六、验证

重启后,把最开始那条命令再跑一遍:

1
2
openclaw gateway call sessions.create --params '{"agentId":"main"}' --json
{"ok": true} # 连续三次,全过

命令行 ping 回 pong,健康检查 {"ok":true,"status":"live"}。控制台的新会话,回来了。

七、三条可迁移的经验

  1. 「能打开」不等于「能用」。 服务活着、端口在听,不代表功能可用。把「进程存活」和「功能可用」分开验证,才能一句话收窄故障范围。
  2. 修 bug 前先找一手来源,别急着卸载重装。 重装同版本只会重现同一个 bug;回滚要先看清数据迁移是不是单向的。很多时候,「换一个版本」救不了「写错的一行判断」。
  3. 热修能救急,但要记得它会过期。 改动打在安装目录里——哪天它自动更新一次,补丁就被覆盖,问题会原样回来。所以:记下来,等正式版修好再撤。

本文不含商业推广。


能打开,却不能对话:一次 Windows 路径 bug 的定位与热修
https://genui.art/2026/10/06/2026-10-05-openclaw-sessions-create-windows-hotfix/
作者
快乐
发布于
2026年10月6日
许可协议