# 第十阶段 · 模块十 · 第三节:Bug 修复实战
如何使用 Claude Code 高效修复 Bug?调试流程是什么?如何快速定位问题根源?
Claude Code 全局架构
┌─────────────────────────────────────────────────────────────────────┐
│ 实战案例 │
│ │
│ Bug 修复实战 ← 本节 │
│ ├── 问题分析 │
│ ├── 调试流程 │
│ └── 修复验证 │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ Bug 修复:改变行为,修复错误 │
│ 重构:改善结构,不改变行为 │
└─────────────────────────────────────────────────────────────────────┘
源码位置:`src/utils/debug.ts`
// Claude Code 的调试功能:
// 1. 调试模式
isDebugMode()
// - --debug 标志
// - 环境变量 DEBUG
// 2. 调试日志
logForDebugging()
// - 详细的调试信息
// - 可过滤
// 3. 错误追踪
// - 堆栈跟踪
// - 错误分类
问 1:修复 Bug 的第一步是什么?
// 修复 Bug 的第一步:
// 1. 复现问题
// - 确认 Bug 存在
// - 了解触发条件
// 2. 收集信息
// - 错误消息
// - 触发步骤
// - 环境信息
// 3. 定位根源
// - 分析代码
// - 使用调试工具
// Claude 会问的问题:
// 1. 期望行为是什么?
// - 你希望发生什么?
// - 实际发生了什么?
// 2. 如何复现?
// - 具体的步骤是什么?
// - 什么条件下触发?
// 3. 环境信息
// - 操作系统
// - Node/Python 版本
// - 相关配置
源码位置:`src/utils/debug.ts`
// Claude Code 的日志级别:
const LEVEL_ORDER = {
verbose: 0, // 最详细
debug: 1,
info: 2,
warn: 3,
error: 4, // 最少
}
// 设置日志级别
CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose
问 1:如何获取详细的调试信息?
// 方法:
// 1. 启用调试模式
claude --debug
// 2. 设置日志级别
CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose
// 3. 查看调试日志
tail -f ~/.claude/debug/latest
┌─────────────────────────────────────────────────────────────────────┐
│ 1. 复现:确认 Bug 存在 │
│ 2. 定位:找到问题代码 │
│ 3. 分析:理解问题根源 │
│ 4. 修复:实施解决方案 │
│ 5. 验证:确认 Bug 已修复 │
│ 6. 回归:确保没有引入新问题 │
└─────────────────────────────────────────────────────────────────────┘
// Claude 使用的调试策略:
// 1. 二分查找
// - 如果 Bug 在第 1000 行
// - 先检查第 500 行
// - 确定 Bug 在前半部分还是后半部分
// 2. 假设验证
// - 提出可能的假设
// - 设计测试验证
// - 排除不正确的假设
// 3. 对比分析
// - 对比正常和异常行为
// - 找出差异点
问 1:如何快速定位 Bug?
// 快速定位的方法:
// 1. 使用日志
// - 添加 console.log
// - 查看变量值
// 2. 使用断点
// - 设置断点
// - 单步执行
// 3. 缩小范围
// - 删除一半代码
// - 确定 Bug 在哪半
// 问题:
// TypeError: Cannot read property 'x' of undefined
// 原因:
// - 访问了 undefined 的属性
// - 对象可能为 null
// 修复:
// ❌ 不好
const name = user.profile.name
// ✅ 好
const name = user?.profile?.name
// 问题:
// Error: Callback was already called
// 原因:
// - 回调函数被调用多次
// 修复:
// ❌ 不好
function readFile(callback) {
callback(data)
callback(error) // 再次调用
}
// ✅ 好
function readFile(callback) {
callback(data)
// 不再调用
}
问 1:如何避免常见 Bug?
// 避免方法:
// 1. 使用 TypeScript
// - 类型检查
// - 编译时发现问题
// 2. 使用 ESLint
// - 代码规范检查
// - 静态分析
// 3. 编写测试
// - 单元测试
// - 集成测试
// 修复 Bug 时:
// 1. 只改必要的代码
// - 不要顺便重构
// - 不要添加新功能
// 2. 保持代码风格一致
// - 遵循项目规范
// - 不要改变格式
// 3. 添加回归测试
// - 防止 Bug 再次出现
// 修复后必须验证:
// 1. 原场景测试
// - 触发 Bug 的步骤
// - 确认 Bug 已修复
// 2. 边界测试
// - 空值
// - 极端值
// 3. 回归测试
// - 原有功能
// - 确保没有破坏
问 1:为什么修复后要立即测试?
// 原因:
// 1. 确认修复有效
// - 立即验证
// - 避免忘记
// 2. 发现引入的新问题
// - 修复可能引入新 Bug
// - 及时发现
// 3. 建立信心
// - 测试通过
// - 代码可以发布
用户报告:点击登录按钮后,页面没有反应
// Claude 问:
// 1. 期望行为:登录成功后跳转到首页
// 2. 实际行为:页面没有变化
// 3. 复现步骤:点击登录按钮
// Claude 检查:
// 1. 查看登录 API 调用
// 2. 查看错误处理
// 3. 查看页面跳转逻辑
// 问题代码:
async function handleLogin() {
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ email, password })
})
// 缺少错误处理
router.push('/home') // 直接跳转
}
// 问题:
// - 如果 API 返回错误,代码仍然跳转
// - 没有检查 response.ok
// 修复后:
async function handleLogin() {
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ email, password })
})
if (!response.ok) {
const error = await response.json()
showError(error.message)
return
}
router.push('/home')
}
问 1:修复后如何验证?
// 验证方法:
// 1. 正常登录
// - 输入正确凭据
// - 确认跳转成功
// 2. 错误凭据
// - 输入错误密码
// - 确认显示错误消息
// 3. 网络错误
// - 断开网络
// - 确认有错误处理
# 启用调试模式
claude --debug
# 启用 verbose 日志
claude --verbose
# 查看调试日志
tail -f ~/.claude/debug/latest
# 查看错误日志
tail -f ~/.claude/logs/errors/latest
源码位置:`src/utils/debug.ts`
// CLAUDE_CODE_DEBUG_LOG_LEVEL 环境变量:
verbose // 最详细(默认关闭)
debug // 默认级别
info // 信息
warn // 警告
error // 仅错误
问 1:如何过滤调试日志?
// 方法:
// 1. 按级别过滤
CLAUDE_CODE_DEBUG_LOG_LEVEL=error
// 2. 按模块过滤
--debug=api:*
// 3. 按关键词过滤
--debug=*User*
答案:
// 方法:
// 1. 收集更多信息
// - 用户环境
// - 操作步骤
// - 时间点
// 2. 添加日志
// - 在可疑位置添加日志
// - 等待 Bug 再次出现
// 3. 代码审查
// - 审查可疑代码
// - 找出潜在问题
// 4. 静态分析
// - 使用 TypeScript/ESLint
// - 找出类型错误
答案:
// 线上 Bug 处理流程:
// 1. 立即止损
// - 回滚到稳定版本
// - 减少影响范围
// 2. 收集信息
// - 错误日志
// - 用户报告
// 3. 本地复现
// - 在测试环境复现
// - 确认修复
// 4. 灰度发布
// - 先给一小部分用户
// - 确认没问题再全量
答案:
// 预防方法:
// 1. 代码审查
// - Pull Request 必须审查
// - 至少一人审查
// 2. 自动化测试
// - 单元测试
// - 集成测试
// - E2E 测试
// 3. TypeScript/ESLint
// - 编译时检查
// - 静态分析
// 4. 监控和告警
// - 尽早发现问题
// - 及时通知
| 资源 | 说明 |
| `/debug` 命令 | 启用调试模式 |
| `src/utils/debug.ts` | 调试工具实现 |
下一节我们将进入 高级技巧:
- 多模型协作
- 自定义技能开发
- 工作流自动化
*- 第一轮:□ 事实准确性*
*- 第二轮:□ 深度与洞见*
*- 第三轮:□ 可读性与价值*