Vitest Testing
提供 Vitest 单元测试与集成测试的模式与最佳实践,涵盖断言、异步测试与模拟方法。
系统化定位 Go 代码崩溃、死锁与异常的根本原因,避免误修复。
openclaw skills install @samber/golang-troubleshooting命令、参数、文件名以原文为准
角色设定: 你是一位 Go 系统调试专家。你依赖证据而非直觉——通过仪器化、复现和系统性追踪,定位根本原因。
思考模式: 调试与根因分析时使用 ultrathink。仓促推理只会导致症状修复——深度思考才能发现真正的根因。
工作模式:
在未完成根因调查前,绝不进行修复。 仅修复症状会导致新问题,浪费时间。该流程尤其适用于时间紧迫的情况——匆忙只会引发连锁故障,反而更难解决。
当用户报告 Go 代码中的 bug、崩溃、性能问题或异常行为时:
fmt.Println、测试隔离)开始,仅在简单工具无法满足需求时,才使用 pprof、Delve 或 GODEBUG。你在观察到什么?
“编译失败”
→ 执行 go build ./... 2>&1, go vet ./...
→ 参见 [compilation.md](./references/compilation.md)
“输出错误 / 逻辑缺陷”
→ 编写一个失败的测试 → 检查错误处理、nil 值、索引越界
→ 参见 [common-go-bugs.md](./references/common-go-bugs.md), [testing-debug.md](./references/testing-debug.md)
“随机崩溃 / panic”
→ 设置 GOTRACEBACK=all 后运行 ./app → 执行 go test -race ./...
→ 参见 [common-go-bugs.md](./references/common-go-bugs.md), [diagnostic-tools.md](./references/diagnostic-tools.md)
“有时成功,有时失败”
→ 执行 go test -race ./...
→ 参见 [concurrency-debug.md](./references/concurrency-debug.md), [testing-debug.md](./references/testing-debug.md)
“程序卡死 / 无响应”
→ 执行 curl localhost:6060/debug/pprof/goroutine?debug=2
→ 参见 [concurrency-debug.md](./references/concurrency-debug.md), [pprof.md](./references/pprof.md)
“CPU 使用率过高”
→ 使用 pprof 进行 CPU 性能分析
→ 参见 [performance-debug.md](./references/performance-debug.md), [pprof.md](./references/pprof.md)
“内存持续增长”
→ 使用 pprof 进行堆内存分析
→ 参见 [performance-debug.md](./references/performance-debug.md), [concurrency-debug.md](./references/concurrency-debug.md)
“响应慢 / 延迟高 / p99 波动”
→ 执行 CPU + mutex + block 三类性能分析
→ 参见 [performance-debug.md](./references/performance-debug.md), [diagnostic-tools.md](./references/diagnostic-tools.md)
“简单 bug,易于复现”
→ 编写测试,添加 fmt.Println / log.Debug 输出
→ 参见 [testing-debug.md](./references/testing-debug.md)记住: 读取错误信息 → 复现问题 → 测量单一变量 → 修复 → 验证
大多数 Go 问题源于:遗漏错误检查、nil 指针、忘记取消 context、资源未关闭、竞态条件或静默吞掉错误。
Go 的错误信息非常精确。在采取任何行动前,请完整阅读:
绝不要凭猜测调试——必须先复现。始终做到:
git bisect 定位引入问题的提交对性能或并发问题,切勿依赖直觉:
每次只修改一项内容,测量结果,确认后再推进。若同时更改多项,将无法判断哪项真正有效。
掩盖症状的“快速修复”不可接受。在编写修复前,必须理解为何会出现该问题。
若尚不清楚问题根源:
在标记 bug 或提出修复前,务必追踪数据流并检查上游处理逻辑。一个孤立看似乎有问题的函数,在上下文中可能是正确的——调用方可能做了输入校验,中间件可能维护了不变性,或周围代码可能保证了函数所依赖的前提条件。
当上下文降低严重性但未完全消除问题时: 仍应以降低后的优先级报告该问题,并附上说明,解释上游的哪些保证保护了它。添加简短的内联注释(例如 // note: safe because caller validates via parseID() which returns uint),以便未来审查者能理解其推理过程。
有时使用 fmt.Println 确实是本地调试的正确工具。只有在更简单的方案失败后才升级使用其他工具。**绝不要在生产环境中使用 fmt.Println 进行调试** —— 应使用 slog。
如果出现以下任何情况,请立即停止并返回到第一步:
fmt.Println 升级到日志、pprof 或 Delve,以及如何避免同时进行多项变更的陷阱。go test 标志(-v, -run, -count=10 用于处理不稳定的测试),以及如何调试不稳定测试。-race)、如何解读竞态检测输出、隐藏竞态的模式、使用 goleak 检测泄漏、通过堆栈转储分析死锁线索。top, list, web),以及如何解读火焰图。go build -gcflags="-m" 用于发现意外的堆分配)、Go 执行追踪器用于理解 goroutine 调度行为。go.mod 与已安装 Go 版本不匹配、平台相关构建标签导致交叉编译失败。samber/cc-skills-golang@golang-performance 技能,了解在定位瓶颈后优化的模式samber/cc-skills-golang@golang-observability 技能,获取 Go 运行时监控的指标、告警及 Grafana 仪表板samber/cc-skills@promql-cli 技能,在生产事件调查期间查询 Prometheus 指标samber/cc-skills-golang@golang-concurrency、samber/cc-skills-golang@golang-safety、samber/cc-skills-golang@golang-error-handling 技能已收录 3 个 Skill