返回博客列表

Claude Code Windows Symlink 权限问题调查

从后台子代理显示 0 tokens 到发现 Windows symlink 权限问题——一次完整的 Bug 调查过程。

#Claude Code#Bug#Windows#Symlink#Open Source

问题发现

在使用 Claude Code 进行代码审查时,我启动了多个后台子代理(sub-agent)并行工作。完成后发现一个奇怪现象:

├─ superpowers:code-reviewer (Review code quality) · 58 tool uses · 0 tokens ⎿ Done
├─ Agent (Review UI/UX design) · 34 tool uses · 0 tokens ⎿ Done
├─ Explore (Explore project structure) · 12 tool uses · 0 tokens ⎿ Done

子代理明明执行了 58 次工具调用,怎么可能是 0 tokens?

第一阶段:怀疑竞态条件

最初通过分析临时文件,我发现了:

指标数值
总输出文件89 个
空文件(0 字节)82 个(92%)
非空文件7 个(8%)

结合 transcript 文件显示实际产生了 41397 tokens,我初步认为这是竞态条件导致的:

T0: 子代理完成
T1: completeAgentTask() 被调用
T2: void evictTaskOutput(taskId)  ← 不等待
T3: enqueueAgentNotification() 发送通知
T4: 主会话读取输出文件 → 文件为空
T5: 磁盘 flush 完成(太晚)

我在 Issue 中详细分析了这个假设。

第二阶段:验证发现异常

为了验证,我再次启动多个后台子代理进行测试。结果:

所有子代理输出文件都是 0 字节!

这太统一了,不像是竞态条件。竞态条件应该有时成功有时失败,而这里是 100% 失败。

第三阶段:发现真正原因

我检查了文件类型:

ls -la *.output
# -rw-r--r-- 1 user 0 ... xxx.output
# 普通空文件

查看源码发现 initTaskOutputAsSymlink() 函数:

  • 尝试创建 symlink 从输出文件指向 transcript
  • 失败时回退为创建空文件

关键发现:Windows 上创建 symlink 需要特殊权限!

测试 PowerShell:

New-Item -ItemType SymbolicLink -Path "link" -Target "target"
# 错误:此项操作需要管理员权限。

确认了:Windows 默认不允许普通用户创建 symlink,需要开启开发者模式

第四阶段:开启开发者模式

开启 Windows 开发者模式:

  • 设置 → 更新和安全 → 开发者选项 → 开发人员模式

重新测试后:

ls -la *.output
# lrwxrwxrwx 1 user 120 ... xxx.output -> agent-xxx.jsonl
# 现在是 symlink,指向 transcript 文件
 
wc -c *.output
# 1498 xxx.output  ← 有内容了!

问题解决!

最终结论

原始假设实际原因
竞态条件❌ 错误
Windows symlink 权限问题✅ 正确

根本原因:

  • Windows 默认不允许普通用户创建 symlink
  • CLI 在 symlink 创建失败时静默回退到空文件
  • 没有向用户提示权限问题或解决方案

提交内容

Issue #55263

在 Issue 中补充了真正的原因分析,并提供了 workaround:

Windows users can try enabling Developer Mode:

  • Settings → Update & Security → For developers → Developer mode

PR #56334

提交了文档改进,在 README 中添加 Windows Developer Mode 说明:

Note for Windows users: Some features require symlink support. Enable Developer Mode if you encounter issues with background agents.

这个 PR 获得了社区用户的 APPROVED。

经验总结

调试方法论

  1. 排除法 - 从多个假设中逐一验证
  2. 统计数据分析 - 92% 的空文件率太统一,不像竞态条件
  3. 检查文件类型 - ls -la 显示文件类型是关键线索
  4. 验证假设 - 开启开发者模式后问题解决
  5. 逐步深入 - 从代码分析 → 行为观察 → 权限验证

真理比面子重要

最初认为问题原因是竞态条件。但当证据指向其他方向时,需要承认错误并补充真正的原因。

真理和诚信比虚名更重要


相关链接


最后更新: 2026-05-04