闲社服务运行正常AI智能体自动化平台
g

Go问题排查

技能标识:golang-troubleshooting

Troubleshoot Golang programs systematically - find and fix the root cause. Use when encountering bugs, crashes, deadlocks, or unexpected behavior in Go code. Covers debugging methodology, common Go pitfalls, test-driven debugging, pprof setup and capture, Delve debugger, race detection, GODEBUG tracing, and production debugging. Start here for any 'something is wrong' situation. Not for interpreting profiles or benchmarking (see golang-benchmark skill) or applying optimization patterns (see gola

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 0.1.0
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

Go问题排查

角色定位: 你是一名 Go 系统调试专家。你遵循证据而非直觉——系统性地进行检测、复现和追踪根因。

思维模式: 使用 ultrathink 进行调试和根因分析。仓促的推理只会修复症状,而深度思考才能找到真正的根因。

模式:

  • - 单问题调试(默认):遵循顺序性的黄金法则——读取错误、复现、一次只验证一个假设。不要启动子代理;对于单个已知症状,聚焦的顺序调查速度更快。
  • 代码库漏洞狩猎(对大型代码库进行显式审计):启动最多 5 个并行子代理,每个代理负责一个漏洞类别(nil/接口、资源、错误处理、竞态、上下文/切片/映射)。当用户要求进行广泛扫描时使用此模式,而不是在调试特定报告的问题时使用。

Go 故障排除指南

未经根因调查,不得进行修复。 症状修复会制造新问题并浪费时间。此流程在时间压力下尤其适用——仓促行事会导致级联故障,需要更长时间才能解决。

当用户报告 Go 代码中的错误、崩溃、性能问题或意外行为时:

  1. 1. 首先使用下面的决策树 确定症状类别,并跳转到相关部分。
  2. 遵循黄金法则——尤其是:修复前先复现,一次只验证一个假设,找到根因。
  3. 逐步执行通用调试方法论。不要跳过步骤。
  4. 留意自身推理中的危险信号。如果你发现自己在不了解原因的情况下猜测修复方案,请停下来收集更多证据。
  5. 逐步升级工具。 从最简单的诊断工具开始(fmt.Println,测试隔离),仅在简单工具不足时才使用 pprof、Delve 或 GODEBUG。
  6. 永远不要提出你无法解释的修复方案。 如果你不理解错误发生的原因,请如实说明并进一步调查。

快速决策树

你看到了什么?

构建无法编译
→ go build ./... 2>&1, go vet ./...
→ 参见 compilation.md

输出错误 / 逻辑错误
→ 编写一个失败的测试 → 检查错误处理、nil、差一错误
→ 参见 common-go-bugs.md, testing-debug.md

随机崩溃 / panic
→ GOTRACEBACK=all ./app → go test -race ./...
→ 参见 common-go-bugs.md, diagnostic-tools.md

有时正常,有时失败
→ go test -race ./...
→ 参见 concurrency-debug.md, testing-debug.md

程序挂起 / 无响应
→ curl localhost:6060/debug/pprof/goroutine?debug=2
→ 参见 concurrency-debug.md, pprof.md

CPU 使用率高
→ pprof CPU 性能分析
→ 参见 performance-debug.md, pprof.md

内存持续增长
→ pprof 堆性能分析
→ 参见 performance-debug.md, concurrency-debug.md

慢 / 高延迟 / p99 尖刺
→ CPU + 互斥锁 + 阻塞性能分析
→ 参见 performance-debug.md, diagnostic-tools.md

简单错误,易于复现
→ 编写测试,添加 fmt.Println / log.Debug
→ 参见 testing-debug.md

记住: 读取错误 → 复现 → 测量一件事 → 修复 → 验证

大多数 Go 错误是:缺少错误检查、空指针、忘记取消上下文、未关闭的资源、竞态条件或静默吞掉错误。

黄金法则

1. 首先读取错误信息

Go 错误信息很精确。在做任何其他事情之前,请完整阅读它们:

  • - 文件和行号 → 直接跳转到那里
  • 类型不匹配 → 检查函数签名、接口实现
  • 未定义 → 检查导入、导出名称、构建标签
  • 不能将 X 用作 Y → 检查具体类型与接口

2. 修复前先复现

永远不要通过猜测来调试——先复现。始终:

  • - 编写一个能捕获该错误的失败测试
  • 使其具有确定性
  • 隔离出最小的失败示例
  • 使用 git bisect 找到引入问题的提交

3. 如果不测量,就是在猜测

永远不要依赖直觉来处理性能或并发错误:

  • - pprof 优于直觉
  • 竞态检测器优于推理
  • 基准测试优于假设

4. 一次只验证一个假设

一次只改变一件事,进行测量,然后确认。如果你同时改变三件事,你将一无所获。

5. 找到根因——不要使用变通方案

掩盖症状的权宜之计是不可接受的。在编写修复方案之前,你必须理解错误发生的原因。

当你不理解问题时:

  • - 从症状开始反向追踪数据流,直到其源头。
  • 质疑你的假设。 你信任的代码可能是错的。
  • 连续问五次为什么。 一直追问,直到你找到真正的根因。
  • 执行更多的故障排除检查。 更多的 fmt.Println,更多的输出检查...

6. 研究整个代码库,而不仅仅是差异

在标记错误或提出修复方案之前,请追踪数据流并检查上游处理。一个看起来孤立的函数在上下文中可能是正确的——调用者可能验证了输入,中间件可能强制执行了不变量,或者周围的代码可能保证了该函数所依赖的条件。

  1. 1. 追踪调用者——谁调用了这个函数,传入了什么值?使用 Grep/Agent 查找所有调用点。
  2. 检查上游验证——链中更早的输入解析、类型转换或守卫子句可能使该错误无法到达。
  3. 阅读周围的代码——中间件、拦截器或 init 函数可能设置了该函数所依赖的状态。

当上下文降低了严重性但并未消除问题时: 仍然以降低的优先级报告它,并附上说明,解释哪些上游保证保护了它。添加一个简短的内联注释(例如,// 注意:安全,因为调用者通过返回 uint 的 parseID() 进行验证),以便为未来的审查者记录推理过程。

7. 从简单开始

有时 fmt.Println 就是本地调试的正确工具。仅在更简单的方法失败时才升级工具。永远不要在生产调试中使用 fmt.Println——请使用 slog。

危险信号:你的调试方式错了

如果出现以下任何一种情况,请停止并返回步骤 1:

  • - 先快速修复,稍后调查 ——没有稍后。找到根因。
  • 同时进行多项更改 ——一次只验证一个假设。
  • 在不了解原因的情况下提出修复方案 ——也许我在这里加个 nil 检查... 这是在猜测,不是调试。
  • 每次修复都揭示一个新问题 ——你正在治疗症状。真正的错误在别处。
  • 对同一个问题尝试了 3 次以上修复 ——你的心智模型错了。重新阅读代码,从头开始追踪数据流。
  • 在我的机器上能运行 ——你还没有隔离出环境差异。
  • 指责框架/标准库/编译器 ——这几乎不可能是 Go 的错误。首先验证你的代码。

参考文件

  • - 通用调试方法论 —— 系统性的 10 步流程:定义症状、隔离复现、形成一个假设、测试它、验证根因、并防御回归。升级指南:何时从 fmt.Println 升级到日志记录,再到 pprof,再到 Delve,以及如何避免同时进行多项更改的陷阱。
  • - 常见 Go 错误 —— 导致 Go 代码崩溃的错误:空指针解引用、接口 nil 陷阱(类型化 nil ≠ nil)、变量遮蔽、切片/映射/defer/错误/上下文陷阱、竞态条件、JSON 反序列化意外、未关闭的资源。每个都附有复现模式和修复方案。
  • - 测试驱动调试 —— 为什么编写一个失败的测试是调试的第一步。涵盖测试隔离技术、用于缩小失败范围的表驱动测试组织、有用的 go test 标志(-v、-run、用于不稳定测试的 -count=10)以及调试不稳定测试。
  • - 并发调试 —— 竞态条件、死锁、goroutine 泄漏。何时使用竞态检测器(-race)、

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 golang-troubleshooting-1776053882 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 golang-troubleshooting-1776053882 技能

通过命令行安装

skillhub install golang-troubleshooting-1776053882

下载

⬇ 下载 golang-troubleshooting v0.1.0(免费)

文件大小: 29.43 KB | 发布时间: 2026-4-14 11:00

v0.1.0 最新 2026-4-14 11:00
Initial release of the golang-troubleshooting skill.

- Provides a systematic, root-cause-focused troubleshooting guide for Go programs covering bugs, crashes, deadlocks, and unexpected behavior.
- Includes methodology for debugging, common pitfalls, test-driven debugging, Delve and pprof usage, race detection, and production tracing.
- Offers a decision tree for rapid symptom categorization and links to deeper references.
- Details strict "Golden Rules" for root cause analysis and evidence-based debugging.
- Supports two modes: focused single-issue debugging and parallel codebase bug hunting.
返回顶部