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 状态融合
有更好的调试技巧?欢迎评论区分享,点赞收藏备用。