Claude Code 代码调试与审查完全指南 | 5 种方法 + 实战模板

3 阅读4分钟

Claude Code 代码调试与审查完全指南 | 5 种方法 + 实战模板

覆盖交互式调试回路、深度推理触发、Git Bisect 自动化、PR 审查集成、结构化 Code Review。


核心思路

Claude Code 调试的根本原则:给模型运行时数据,而不是让它靠静态代码猜行为。

❌ 低效方式:把代码丢给 Claude 让它找 bug
✅ 高效方式:给 Claude 代码 + 实际运行时的日志/错误/状态

方法 1:交互式调试回路

工作流

Step 1: 在关键位置插入日志
    ↓
Step 2: 运行程序,收集真实输出
    ↓
Step 3: 将日志输出反馈给 Claude
    ↓
Step 4: Claude 基于真实数据分析 → 修复或建议更多日志
    ↓
重复直到定位问题

步骤 1:插入调试日志

在 @src/services/order.ts 的 createOrder 函数里,
在以下位置添加详细日志(使用 DEBUG 前缀,方便过滤):

1. [DEBUG-IN] 函数入口:打印所有参数
2. [DEBUG-VALIDATE] 参数验证后:打印验证结果
3. [DEBUG-DB-BEFORE] 数据库写入前:打印将要写入的数据
4. [DEBUG-DB-AFTER] 数据库写入后:打印返回的 id 和状态
5. [DEBUG-CACHE] 缓存更新:打印缓存 key 和值
6. [DEBUG-OUT] 函数出口:打印最终返回值

步骤 2:运行并收集日志

# 运行并过滤调试日志
node app.js 2>&1 | grep DEBUG

# 或者全量日志
node app.js 2>&1 > debug.log
cat debug.log | claude "分析这些日志,找出创建订单失败的根因"

步骤 3:分析日志

这是实际运行的调试日志:

[DEBUG-IN] createOrder called with: { userId: "u123", items: [...], total: 99.99 }
[DEBUG-VALIDATE] Validation passed: true
[DEBUG-DB-BEFORE] Inserting: { userId: "u123", items: [...], total: 99.99, status: "pending" }
[DEBUG-DB-AFTER] Insert result: { id: null, rowsAffected: 0 }
[DEBUG-OUT] Returning: null

分析:为什么 rowsAffected  0?数据库没有实际写入数据。

方法 2:深度推理模式(ultrathink)

使用场景

  • 并发/竞态条件问题
  • 偶发性 bug(难以稳定复现)
  • 安全漏洞分析
  • 性能瓶颈根因

标准提示词模板

ultrathink:

问题描述:
[详细描述症状,包括频率、触发条件、影响范围]

环境信息:
- 运行时:Node.js v20.10.0 / Go 1.21
- 数据库:PostgreSQL 15.3
- 并发量:~1000 req/s

相关代码:
@src/services/payment.ts

运行时数据/日志:
[粘贴或管道传入]

排查重点:
1. 并发安全性
2. 事务边界
3. 幂等性设计

关键词效果对比

不加关键词    → 模型直接输出第一反应
think deeply  → 稍微多分析一层
ultrathink    → 激活扩展推理,系统性分析多个假设

方法 3:Git Bisect 自动化

适用场景

某次发布后引入了 bug,需要找到引入该 bug 的具体提交。

完整流程

Step 1:准备验证脚本

# 让 Claude 帮你写验证脚本
"写一个 bash 脚本 bisect_test.sh,
用于验证 @src/api/user.ts 的 getUserById 接口是否正常:
- 返回 0 表示正常(good)
- 返回 1 表示有问题(bad)
测试命令:npm test src/api/user.test.ts"

Claude 生成的验证脚本:

#!/bin/bash
set -e

# 安装依赖(如果需要)
npm install --silent 2>/dev/null

# 运行测试
npm test src/api/user.test.ts 2>&1

if [ $? -eq 0 ]; then
    echo "GOOD: Tests passed"
    exit 0
else
    echo "BAD: Tests failed"
    exit 1
fi

Step 2:执行 Bisect

git bisect start
git bisect bad HEAD          # 当前版本是坏的
git bisect good v2.1.0       # 这个版本是好的
git bisect run ./bisect_test.sh

Step 3:分析结果

# Git 会自动找到引入问题的提交
# 让 Claude 分析这个提交
git show [commit-hash] | claude "分析这次提交引入了什么问题"

方法 4:结构化 Code Review

安全审查模板

以安全专家的视角审查 @src/api/auth.ts:

检查项目:
1. 认证绕过漏洞(JWT 验证、token 过期检查)
2. 授权漏洞(越权访问、IDOR)
3. 注入漏洞(SQL 注入、命令注入)
4. 敏感信息泄露(日志中的密码/token、错误信息过于详细)
5. 速率限制是否到位

输出格式:
每个问题:
- 严重程度:[Critical / High / Medium / Low]
- 位置:文件名:行号
- 描述:发现了什么问题
- 攻击向量:如何被利用
- 修复建议:具体怎么改

性能审查模板

审查 @src/services/product.ts 的性能:

关注点:
1. N+1 查询问题
2. 未使用的数据库索引
3. 大对象在内存中的生命周期
4. 不必要的同步操作(应该异步的地方)
5. 缓存策略是否合理

输出:
每个问题包含预计性能影响(QPS 下降 / 内存增加 等)

可维护性审查模板

审查 @src/utils/dataTransform.ts 的代码质量:

检查:
1. 函数是否单一职责
2. 是否有重复逻辑可以抽取
3. 命名是否清晰
4. 边界条件是否处理
5. 是否有应当添加注释的复杂逻辑

风格遵循:@CLAUDE.md 中定义的编码规范

方法 5:浏览器调试集成

前端 Bug 调试模板

@src/components/PaymentForm.tsx 在提交时偶发崩溃。

浏览器控制台错误:
TypeError: Cannot read property 'cardNumber' of undefined
    at PaymentForm.handleSubmit (PaymentForm.tsx:45)
    at HTMLFormElement.onsubmit

React DevTools 组件状态(崩溃时):
props: {
  onSuccess: [function],
  amount: 99.99
}
state: {
  formData: null,  //  注意这里是 null
  isLoading: true,
  error: null
}

Network 请求记录:
- POST /api/payment/init  200 OK(返回了 sessionId)
- 没有后续请求(崩溃在请求发出前)

分析问题并修复。

调试环境配置

推荐的日志配置(Node.js)

// debug-logger.js
const DEBUG = process.env.DEBUG === 'true';

export const debugLog = (prefix, data) => {
  if (DEBUG) {
    console.log(`[${new Date().toISOString()}][${prefix}]`,
      JSON.stringify(data, null, 2));
  }
};

管道传输的几种场景

# 传递应用日志
tail -f app.log | grep ERROR | claude "实时分析这些错误"

# 传递测试结果
npm test 2>&1 | claude "哪些测试失败了,找出共同根因"

# 传递 CPU/内存 profile
node --prof app.js
# 采集完成后
node --prof-process isolate-*.log | claude "分析性能瓶颈"

# 传递数据库慢查询日志
tail -100 /var/log/postgresql/postgresql-slow.log | claude "找出最耗时的查询"

API 配置

使用 ccaihub.com 作为 Claude API 中转:

# .env 配置
ANTHROPIC_BASE_URL=https://ccaihub.com/v1
ANTHROPIC_API_KEY=your-key

# 集成到调试脚本
cat error.log | ANTHROPIC_BASE_URL=https://ccaihub.com/v1 \
  ANTHROPIC_API_KEY=your-key \
  claude "分析这些错误"

速查卡

场景                     → 方法
─────────────────────────────────────────
逻辑 bug                 → 交互式调试回路(加日志+喂数据)
并发/偶发 bug            → ultrathink + 详细运行时信息
某次提交引入的 bug       → Git Bisect 自动化
安全漏洞检查             → 结构化 Code Review(安全视角)
性能问题                 → 结构化 Code Review(性能视角)
前端渲染崩溃             → 浏览器日志 + DevTools 状态融合

有更好的调试技巧?欢迎评论区分享,点赞收藏备用。