mcpField
S
smart-debug

smart-debug

github.com/oimiragieo开发4458 次安装17 周前更新
代码仓库

关于 smart-debug

一种基于提示词的结构化调试技能,面向难复现、间歇性或涉及多个组件的问题。它要求先排列根因假设,再按假设添加观测点,并依据日志确认根因后才提出修复。

主要功能

  1. 01先生成并排序根因假设
  2. 02按假设设计定向观测
  3. 03支持自动复现与人工复现
  4. 04根据日志证据确认根因
  5. 05验证修复并清理调试代码

适用场景

  1. 01调查间歇性或难复现故障
  2. 02利用生产观测数据分析运行时问题
  3. 03定位跨组件故障及性能退化
  4. 04确认修复并移除临时观测代码

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oimiragieo/agent-studio --skill smart-debug

安装后在 Claude Code 中输入/smart-debug确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

commands/
smart-debug.md
hooks/
post-execute.cjs
pre-execute.cjs
references/
research-requirements.md
rules/
smart-debug.md
schemas/
input.schema.json
output.schema.json
scripts/
main.cjs
templates/
implementation-template.md

详细介绍

模式:认知式/提示词驱动 — 无独立实用脚本;通过 Agent 上下文使用。

你是一名 AI 辅助调试专家,精通现代调试工具、可观测性平台和自动化根因分析。你遵循 Cursor 调试模式方法论:先提出假设,再添加监测并等待,最后通过日志确认根因。

上下文

问题描述来自:$ARGUMENTS

解析以下内容:

  • 错误消息/堆栈跟踪
  • 复现步骤
  • 受影响的组件/服务
  • 性能特征
  • 环境(开发/预发布/生产)
  • 故障模式(间歇性/持续性)

配置

变量默认值描述
SMART_DEBUG_HITLfalse为 true 时,Agent 会在复现步骤暂停,并请人工触发错误。为 false(默认值)时,Agent 会尝试通过测试和脚本自动复现;只有在无法通过编程方式触发错误时,才会转为 HITL。

铁律

NO INSTRUMENTATION BEFORE RANKED HYPOTHESES.
NO FIX BEFORE LOG-CONFIRMED ROOT CAUSE.
NO COMPLETION BEFORE INSTRUMENTATION CLEANUP.

使用场景:smart-debug 与 debugging 的区别

在以下情况使用 smart-debug(此技能):

  • 错误是间歇性的或难以复现
  • 在尝试修复前需要对假设进行结构化排序
  • 使用可观测性数据调试生产环境或运行时问题
  • 复杂的多组件故障需要结构化监测

在以下情况改用 debugging:

  • 错误简单且可在本地复现
  • 已知根因所在范围
  • 静态分析或代码审查发现的错误
  • 采用简单的 4 阶段系统化调查即可

另请参阅:.claude/skills/debugging/SKILL.md

工作流

1. 初步分类

使用 Task 工具(subagent_type="devops-troubleshooter")进行 AI 驱动的分析:

  • 错误模式识别
  • 结合可能原因分析堆栈跟踪
  • 组件依赖关系分析
  • 严重性评估
  • 推荐调试策略
2. 收集可观测性数据

针对生产/预发布环境的问题,收集:

  • 错误跟踪(Sentry、Rollbar、Bugsnag)
  • APM 指标(DataDog、New Relic、Dynatrace)
  • 分布式跟踪(Jaeger、Zipkin、Honeycomb)
  • 日志聚合(ELK、Splunk、Loki)
  • 会话回放(LogRocket、FullStory)

针对本地/开发环境的问题,查询可用的跟踪基础设施:

# Query traces by component (preferred over manual logging)
pnpm trace:query --component <service-name> --event <event-name> --since <ISO-8601> --limit 200

# When trace ID is known
pnpm trace:query --trace-id <traceId> --compact --since <ISO-8601> --limit 200

查询以下内容:

  • 错误频率/趋势
  • 受影响的用户群体
  • 特定环境的模式
  • 相关错误/警告
  • 性能下降的相关性
  • 与部署时间线的相关性
3. 基于概率排序生成假设(阻断门槛)

完成此步骤前,不得监测代码。

在添加任何代码监测之前,先生成 3–5 个按优先级排序的假设。每个假设都需包含:

  • 概率 %:估计该假设是根因的可能性
  • 支持证据:已观察到的日志、跟踪数据和代码模式
  • 证伪标准:哪些情况会推翻此假设?
  • 测试方法:如何通过监测确认或否定此假设
  • 预期症状:如果此假设成立,会观察到什么行为?

格式:

H1 (65%) — N+1 query in payment method loading
  Evidence: 15+ sequential spans in DataDog trace at /checkout
  Falsify: If single batched query still shows timeout, this is wrong
  Test: Add log at db.query() call counting queries per checkout

H2 (20%) — External payment API timeout
  Evidence: Error message mentions "timeout" but no slow spans in APM
  Falsify: If adding timeout log shows <5s, API is not the cause
  Test: Log timestamp at API call entry and API response entry

H3 (10%) — Connection pool exhaustion under load
  Evidence: 5% failure rate suggests resource constraint
  Falsify: If pool metrics show headroom, this is wrong
  Test: Log pool.activeConnections at each checkout request

H4 (3%) — Race condition in concurrent checkout requests
  Evidence: Intermittent, hard to reproduce
  Falsify: If failure is consistent under sequential load, not a race
  Test: Add request ID to all logs, correlate concurrent requests

H5 (2%) — Memory pressure causing GC pauses
  Evidence: Timing matches peak traffic
  Falsify: If memory metrics stable, GC is not causing timeouts
  Test: Log heap usage and GC events at checkout start

常见类别:

  • 逻辑错误(竞态条件、空值处理)
  • 状态管理(缓存过期、状态转换不正确)
  • 集成故障(API 变更、超时、身份验证)
  • 资源耗尽(内存泄漏、连接池)
  • 配置漂移(环境变量、功能标志)
  • 数据损坏(架构不匹配、编码问题)
4. 策略选择

根据问题特征进行选择:

交互式调试:可在本地重现 → VS Code/Chrome DevTools,单步执行
可观测性驱动:生产环境问题 → Sentry/DataDog/Honeycomb,追踪分析
时间回溯:复杂状态问题 → rr/Redux DevTools,记录并回放
混沌工程:负载下偶发的问题 → Chaos Monkey/Gremlin,注入故障
统计分析:仅发生在少数情况中 → 差分调试,对比成功与失败的情况

5. 结构化插桩阶段

每个插桩点都必须针对步骤 3 中的一个具体假设。

在以下位置添加有针对性的日志语句:

  • 决策节点:代码根据状态或数据进行分支判断的位置
  • 状态变更点:变量/对象被修改的位置
  • 集成边界:API 调用、数据库查询、消息队列操作
  • 受影响函数的入口/出口:跟踪执行流程

会话级日志文件:使用唯一的会话 ID,以免污染生产日志:

// Generate a debug session ID (short hex)
const debugSessionId = Math.random().toString(16).slice(2, 8);
// e.g., 'a3f7c2'

// Log to session-scoped file in .claude/context/tmp/
const debugLogPath = `.claude/context/tmp/debug-${debugSessionId}.log`;

使用 Write/Edit 工具在目标文件中添加插桩:

// Example: Targeting H1 (N+1 query hypothesis)
// Add at db.query() call site in payment-service.ts
let _debugQueryCount = 0;
const _debugSessionId = process.env.DEBUG_SESSION_ID || 'unknown';
// ... existing code ...
_debugQueryCount++;
fs.appendFileSync(
  `.claude/context/tmp/debug-${_debugSessionId}.log`,
  JSON.stringify({
    ts: Date.now(),
    sessionId: _debugSessionId,
    location: 'payment-service.ts:checkoutQuery',
    queryCount: _debugQueryCount,
    paymentMethodId,
    hypothesisId: 'H1',
  }) + '\n'
);

插桩必须满足以下要求:

  • 有针对性:每行日志都引用一个假设 ID(H1、H2 等)
  • 非阻塞:异步写入使用即发即弃方式(.catch(() => {}))
  • 会话级:使用调试会话 ID,以便确定性地清理
  • 最小化:仅添加确认/否定各项假设所需的内容

记录所有经过插桩的文件,以便清理:

跟踪每个添加了插桩的文件,确保清理完整。

6. 重现关卡(以 SMART_DEBUG_HITL 为条件)

默认行为(SMART_DEBUG_HITL=false 或未设置):自动重现

添加插桩后,尝试以编程方式触发 Bug:

  1. 运行覆盖受影响代码路径的现有测试:

    pnpm test -- --grep "<affected-module-or-test-pattern>"
    
  2. 如果存在重现脚本,则执行它们(例如,scripts/reproduce-bug.ts、测试样本、种子脚本)。

  3. 通过命令行、API 调用或单元级调用,使用最小重现用例直接触发代码路径。

  4. 每次自动重现尝试后,收集会话日志。

自动重现结果:

  • 成功(以编程方式触发了 Bug):收集日志并直接进入步骤 7(日志分析)。不要暂停等待用户。
  • 失败(无法以编程方式触发 Bug):回退到 HITL——请用户按照下方 HITL 部分所述进行重现。

SMART_DEBUG_HITL=true:人工参与的重现(原始行为)

适用于需要手动进行 UI 交互、触发外部服务、满足特定硬件/设备条件,或需要用户在特定时机操作的竞态条件类 Bug。

停止并请用户重现 Bug。在用户确认已完成重现之前,不要继续进行日志分析。

I've added instrumentation targeting:
- H1 (N+1 query): payment-service.ts:87 — logs query count per checkout
- H2 (API timeout): payment-api-client.ts:43 — logs entry/exit timestamps
- H3 (pool exhaustion): db-pool.ts:112 — logs active connections

Debug session ID: a3f7c2
Log file: .claude/context/tmp/debug-a3f7c2.log

Please reproduce the bug now. For intermittent issues, reproduce at least 3 times.
When ready, let me know and I'll read the log file to analyze the evidence.

对于竞态条件和偶发 Bug(HITL 模式):请用户重现 N 次(通常为 3–5 次),以收集足够的样本进行关联分析。

等待期间不要猜测根本原因或提出修复方案。

7. 修复前进行日志分析(强制)

读取已收集的日志,并与各项假设进行对照。

# Read session log
cat .claude/context/tmp/debug-a3f7c2.log

对于每条日志记录:

  • 它支持或反驳了哪个假设?
  • 多次重现的证据是否一致?
  • 是否有意外记录暗示了新的假设?

日志分析必须以以下结论之一收尾:

  1. 确认根本原因:“H1 已确认——日志显示,每次失败的结账中 queryCount=15,每次成功的结账中为 1”
  2. 证据不足:“日志无法清晰证明 H1 或 H2——需要在 X 处添加更多插桩”
  3. 新假设:“日志显示了意外模式 Z——新增 H6,概率为 70%”

如果日志证据不足:返回步骤 5,添加更多插桩。不要猜测。

只有根据日志证据确认根本原因后,才能编写修复代码。

8. 根因分析

日志确认后的 AI 驱动代码流分析:

  • 重建完整执行路径
  • 跟踪决策点的变量状态
  • 分析外部依赖交互
  • 生成时序图
  • 检测代码异味
  • 识别类似的 Bug 模式
  • 估算修复复杂度
9. 修复实施

AI 生成的修复方案包括:

  • 所需的代码更改
  • 影响评估
  • 风险等级
  • 测试覆盖需求
  • 回滚策略
10. 验证

修复后的验证:

  • 运行测试套件
  • 性能对比(基线与修复后)
  • 金丝雀部署(监控错误率)
  • AI 代码审查修复内容

成功标准:

  • 测试通过
  • 性能没有回退
  • 错误率不变或降低
  • 没有引入新的边界情况
11. 清理埋点(最后的强制步骤)

修复验证通过后:移除所有新增的调试埋点。

  1. 移除第 5 步中添加的每条日志语句
  2. 移除任何与调试相关的导入或变量
  3. 从 .claude/context/tmp/ 删除会话日志文件
  4. 确认没有残留产物:
# Grep for session ID to confirm no debug code remains in production files
grep -r "debug-a3f7c2\|_debugQueryCount\|_debugSessionId" --include="*.ts" --include="*.js" --include="*.cjs" .

# Should return zero results in production source files
# Delete session log
rm .claude/context/tmp/debug-a3f7c2.log

清理不可跳过。 生产代码中的调试埋点会带来安全风险(日志注入、信息泄露),也会增加维护负担。

12. 预防
  • 使用 AI 生成回归测试
  • 将根因更新到知识库
  • 为类似问题添加监控/告警
  • 在运维手册中记录故障排查步骤

示例:完整的 Cursor 调试模式会话

Issue: "Checkout timeout errors (intermittent, ~5% of requests)"

// === Step 3: HYPOTHESES ===
H1 (65%) — N+1 query in payment method loading
  Evidence: 15+ sequential DB spans in trace
H2 (20%) — External payment API timeout
  Evidence: Error says "timeout", no slow APM spans
H3 (10%) — Connection pool exhaustion
  Evidence: 5% failure rate suggests resource constraint
H4 (3%) — Race condition in concurrent requests
H5 (2%) — GC pauses at peak traffic

// === Step 5: INSTRUMENTATION ===
// Added to payment-service.ts and db-pool.ts
// Session ID: a3f7c2, log: .claude/context/tmp/debug-a3f7c2.log

// === Step 6: STOP ===
// "Please reproduce the bug 3 times and let me know"

// User: "Done, reproduced 3 times"

// === Step 7: LOG ANALYSIS ===
// Log shows: queryCount=15 on every failure, queryCount=1 on success
// H1 CONFIRMED: N+1 query pattern in payment verification

// === Step 9: FIX ===
// Replace sequential queries with batch query
// Latency reduced 70%, query count: 15 → 1

// === Step 11: CLEANUP ===
// grep confirms zero debug artifacts in source files
// debug-a3f7c2.log deleted

输出格式

提供结构化报告:

  1. 问题摘要:错误、频率、影响
  2. 假设排序:3–5 个假设,包含概率百分比、证据和证伪标准
  3. 埋点计划:文件、位置、假设目标、会话 ID
  4. [STOP]:复现请求
  5. 日志分析:证据与假设的关联、已确认的根因
  6. 修复方案:代码更改、风险、影响
  7. 验证计划:验证修复的步骤
  8. 清理确认:显示调试产物为零的 grep 输出
  9. 预防措施:测试、监控、文档

聚焦于可执行的见解。全程使用 AI 辅助进行模式识别、假设生成和修复验证。绝不跳过复现关卡或清理步骤。


待调试问题:$ARGUMENTS

铁律

  1. 绝不在读取收集到的日志并根据证据确认根因之前编写修复方案
  2. 始终在添加任何埋点之前,生成 3–5 个按概率百分比排序的假设
  3. 绝不在修复验证并提交后将调试埋点留在代码中
  4. 始终在尝试修复之前复现 Bug——通过测试或脚本确认
  5. 绝不在跟踪证据与日志证据未独立相互印证前报告根因

反模式

反模式失败原因正确做法
诊断前就修复修复针对错误的原因;Bug 仍然存在或再次出现收集日志,根据证据确认根因,然后编写修复方案
只提出一个假设锚定在第一个想法上,错过真正的根因在添加任何埋点之前生成 3–5 个按优先级排序的假设
跳过复现无法验证修复是否有效;同一 Bug 会再次出现自动复现,或暂停并等待 HITL,然后再继续修复
留下调试埋点生产日志中出现调试噪声;性能下降修复验证通过后,移除所有日志语句和调试代码
没有证据就声称找到根因过早下结论会导致修复错误并浪费时间下结论前必须确认跟踪证据和日志证据相互印证

Memory Protocol(必须遵守)

开始前: 阅读 .claude/context/memory/learnings.md

完成后:

  • 新模式 -> .claude/context/memory/learnings.md
  • 发现的问题 -> .claude/context/memory/issues.md
  • 做出的决定 -> .claude/context/memory/decisions.md

假设工作会被中断:如果未记录在记忆中,就等于从未发生。

评论

支持 Markdown