修到一半,AI 搭子不见了
Kimi Code 无声退出怎么查?我把"日志末行加零记录"拼成签名拿去搜官方仓库,直接命中 issue #3189。
10 月 6 日晚上,我在自己的经营驾驶舱系统里用 element-picker 干活。element-picker 是我自研的浏览器插件:在网页上圈选一个元素,它产出一段结构化 JSON,我把 JSON 喂给 AI 改界面。9 月 29 日它刚上架 Edge 加载项,今晚拿自己的真实项目练手。
Kimi Code 是我日常用的 AI 编程命令行工具,当晚的搭档。原计划挺顺:用插件圈元素、AI 改界面,顺手把插件自身的毛病修一修。
结果一晚上出了三件事。插件连撞两个 bug 算计划内的惊喜,计划外的是:晚上 9 点不到,修到一半,Kimi Code 的进程没了。没报错,没弹窗,窗口就那么消失了。
第一个 bug:面板把自己挡在了元素上面
先说小的。晚上 8 点 56 分,我给 AI 报障,原话是:
"固定在页面的右上角,导致右上角的部分元素被覆盖,无法选取。"
element-picker 的控制面板钉死在页面右上角,正好压住我要圈选的元素。现象直给,不用猜,AI 直接翻到 picker.js 的面板定位 CSS:标题栏改成可拖拽,mousedown、mousemove、mouseup 三件套,加边界钳制防止拖出视口;拖动期间暂停悬停高亮,免得误触。
8 点 59 分修完,commit 1a1ca06,版本号升到 v1.1.3。从报障到修复 3 分钟,这是小工具该有的修 bug 速度。
修复代码落盘、还没提交的时候,意外来了。
进程没了,第一轮排查方向整个反了
我发现 Kimi Code 窗口不见了,重启,在新窗口里输了个 cls 想清屏,又取消退出,然后 resume 回原会话,输了"继续"接着干。活干完一段落,我问了一句:
"刚刚是什么 bug 导致,退出了 kimi code?"
AI 翻日志,很快给到结论:20:58 那个 cls 会话里写着这么一行:
lastTurnReason: "cancelled"
于是它判断:不是 bug,是人为取消。我看到这个结论就知道不对:
"这个是 Kimi Code 退出以后重启的 Kimi Code,我才输的 CLI。"
退出发生在前,cls 窗口是重启之后的产物。AI 把"重启后的窗口"当成了"退出的窗口",故障对象搞错了,结论方向整个反掉。这一轮误判,烧掉约 4 个工具调用。
教训当场记下:排查类问题,先锁定对象,再谈原因。对象没确认之前,一切归因都是空转。
四层日志全零,反而成了最硬的线索
第二轮排查换了思路,查的是退出发生时那个原会话。它的日志文件 wire.jsonl 在 20:58:15 戛然而止:第 4 步 Edit 工具的结果刚落盘,turn 连 turn.ended 这一行都没来得及写。
再往外查:kimi-code.log 零记录,Windows 事件日志零记录,Defender 零记录。四层日志,干干净净。自动更新也排除了:v2.1.1 从 9 月 25 日就在用,所有更新检查都返回没有新版本。
查不下去,先记账。晚上 9 点 15 分,我按"根因未定位"把故障记进台账,commit 09830a3。
到这里我以为这事得先悬着了。结果我自己说的下一句话,把整晚的走向改了:
"这个故障已经发生好几次了,应该是 Kimi Code 自己的问题。"
这句话把排查从"单次事件归因"切换成"模式取证":不再盯着一个会话看,而是全量扫描所有历史会话的 state.json 和日志尾行。一扫就出货:同一天下午 4 点 23 分,另一个会话的第 26 步 llm request 发出去之后,永远没有响应记录。和晚上这起一模一样,wire 戛然而止、没有 turn.ended、四层日志零记录。
两起猝死,同一个签名。拿着这个签名去搜官方仓库,直接命中 issue #3189,状态 OPEN:Windows 上进程无日志硬崩溃,根因是 libuv 的异步句柄断言:
UV_HANDLE_CLOSING, src\win\async.c:76
fail-fast 机制直接中止进程,JS 层来不及写任何日志。有用户确认 v2.1.1 仍然复现,和我的版本对得上。我定性没错。
这就是当晚最值钱的认知:无日志本身就是日志签名。进程消失加四层日志全零,等于原生层 fail-fast,这个签名可以直接拿去匹配已知 issue,比盲猜终端宿主、杀毒、系统更新高效得多。我随后导出 debug 包,台账更新归因,commit c3ea51c,时间是 9 点 35 分。
第二个 bug:iframe 是一堵事件边界墙
9 点 43 分,第二个 bug 来了。这次报障我直接贴上拾取器产出的 JSON:
"这个弹出框里面的元素无法选取。"
JSON 显示,拾取器在弹窗里只能选中 el-dialog 的外壳,里面的元素一个都摸不到。有了结构化证据,AI 跳过猜原因,直接 grep 驾驶舱源码,matrix/index.vue 第 167 行现形:预览内容是一个 iframe 渲染的:
<iframe sandbox="allow-same-origin">
根因是机制级的:iframe 内部的事件不冒泡到父文档,而拾取器的监听只挂在顶层 document 上。iframe 里的元素,对它就是盲区。"监听挂在 document 就全覆盖",这是个错觉。
修法是把 picker.js 重构为多文档挂载:样式、提示条、事件监听挂进每一个同源 iframe 的文档;用 MutationObserver 兜住激活后动态插入的 iframe,这正是 el-dialog 打开的场景;iframe 内跳转自动重挂;产出的 JSON 新增 frameSelector 和 frameUrl 两个字段,标注元素属于哪个 frame;退出时逐文档清理,零残留。
修完不能拍脑袋说好了。我用 playwright-core 加本机缓存的 Chromium 搭了个自动化测试页,静态 iframe 和动态插入 iframe 两种形态都测,6 项断言全绿:顶层拾取回归、iframe 内拾取、frameSelector 标注、样式采集、动态 iframe、退出零残留。commit db82a12,v1.1.4。测试脚本用完即删,放在 %TEMP%,不进仓库。
9 点 56 分,dist 目录里打出 element-picker-v1.1.4.zip,8 个文件,和上架包结构一致,commit c519383。从坐下到收工,一小时出头。
四条纪律,以后每次排查都能用
一晚上的战果,落成四条纪律,你排查自己的崩溃和盲区时可以直接搬:
- 排查先锁对象,再谈归因。我第一轮把重启窗口当成退出窗口,结论整个反了。报障时多说一句"是哪个窗口、哪个会话",能省一整轮误判。
- 无日志本身就是日志签名。进程消失加各层日志全零,是原生层 fail-fast 的特征;拼出签名去搜官方 issue,比盲猜高效得多。
- iframe 是事件边界。父文档的监听摸不到 iframe 内部,同源 iframe 要逐文档注入;做拾取类、标注类页面工具的,这条迟早用上。
- 随做随 commit 是猝死保险。Kimi Code 20:58 死掉的时候,我 bug① 的拖拽修复已经落盘待提交,resume 之后零损失跑完。进程会猝死,落盘的代码不会。
企业读者换算一笔:这套纪律搬进公司研发团队一样成立。AI 结对排查时,"先锁故障对象"省的是整轮方向错误的工时,我这轮误判烧掉约 4 个工具调用,换成人就是一整轮白查;"崩溃签名匹配已知 issue"对任何原生层崩溃都通用,一次命中,省掉的是整轮盲查。
FAQ
Q:"无日志即签名"这招,怎么用到别的崩溃排查上?
A:三步。先确认进程是真没了还是假死;再把所有可能留痕的日志层挨个查一遍,全零本身就是信息;然后把"消失时间点、日志里写下的末行动作、各层零记录"拼成签名,拿去搜官方仓库和 issue 列表。原生层崩溃 fail-fast 来不及写日志,这个特征比错误码还稳定。
Q:同源 iframe 注入具体怎么挂?跨域 iframe 呢?
A:同源场景,比如本篇这种 sandbox="allow-same-origin",父页面可以直接访问 iframe 的 contentDocument,把样式和监听逐个文档挂进去,再用 MutationObserver 盯住动态插入的 iframe。跨域 iframe 受浏览器同源策略限制,父页面摸不到 contentDocument,我这次没遇到也没实测,不瞎给方案;思路是在 iframe 那一侧注入脚本,通过 postMessage 和父页面协作,方向先放这。
Q:issue #3189 官方修了吗?
A:到我写这篇时状态还是 OPEN。我能做的是三件事:debug 包已经导出备着,下次复发直接打包附到 issue 下面;台账里记了跟踪规则,修复版本发布后升级并回归观察;在那之前,随做随 commit,真猝死也只丢当轮。
Q:element-picker 能下载吗?
A:9 月 29 日已经上架 Edge 加载项,搜 element-picker 能找到。本篇修的 v1.1.4 更新包已经打好,商店侧更新要走合作伙伴中心传包,那一步是我自己的待办。
我是野生码农,AI实战派。17年全栈工程师,一人AI公司实践者。打造个人IP内容体系、软件全链路产品产线,拥有百套企业AI方案、200多个岗位Agent;自研知识库、AI数字员工系统,公开实战复盘。
本文所有内容均为本人 AI 实战的过程和结果,经 AI 整理后发布,无任何瞎编虚构内容。
这篇来自《数字员工养成记》系列。
关注我,看真的。
野生码农AI实战 · 全网同名