T03 测试与质量 ⭐⭐ ⏱ 约 30 分钟

Bug诊断与根因

Bug Reproduction & Root Cause

💡 适用场景: 问题排查、性能诊断

📄 T03: Bug Reproduction and Root Cause(Bug诊断与排查) 其他

⭐⭐ 初中级 | 系统化的问题诊断和根因分析方法

💡 核心概念 核心概念

有效的Bug诊断需要遵循这些步骤:

  1. 准确描述现象 - 问题表现是什么
  2. 收集诊断信息 - 日志、堆栈跟踪、环境信息
  3. 设定重现步骤 - 如何触发这个问题
  4. 隔离变量 - 确定哪些因素影响问题
  5. 定位根因 - 问题的真实原因在哪里
  6. 提出解决方案 - 如何修复

最佳实践 最佳实践

🎯 原则1: 完整的错误信息

  • ❌ 差: "系统出错了"
  • ✅ 好: "RuntimeException: NullPointerException at UserService.getById(line 45)"

🎯 原则2: 明确的重现步骤

  • ❌ 差: "有时候会崩溃"
  • ✅ 好: "1.登录系统 2.点击用户列表 3.搜索名字包含特殊字符 → 报错"

🎯 原则3: 环境信息清晰

  • ❌ 差: "我的电脑上有这个问题"
  • ✅ 好: "Java 11, Spring Boot 2.6, MySQL 8.0, 在MacOS上"

🎯 原则4: 展示你的诊断过程

  • ❌ 差: "请修复这个bug"
  • ✅ 好: "我已经检查了[做过的事],结果是[发现],推测问题在[位置]"

📄 三层诊断方法 其他

第1层: 错误信息分析

通过错误堆栈跟踪快速定位问题位置

Prompt模板:

这是我遇到的错误,请帮我分析:

错误堆栈:
[粘贴完整的错误堆栈跟踪]

错误发生时的操作:[用户在做什么]

问题:
1. 错误的根本原因是什么?
2. 哪一行代码有问题?
3. 为什么会抛出这个异常?
4. 怎样快速修复?

第2层: 日志诊断

通过日志追踪程序执行流程

Prompt模板:

我的应用出现性能问题,以下是日志。请帮我分析:

日志片段:
[粘贴相关日志]

问题现象:
- 响应时间:[多长]
- 错误频率:[多久发生一次]
- 影响范围:[影响哪些用户或操作]

请分析:
1. 从日志看问题发生的顺序是什么?
2. 可能的瓶颈在哪里?
3. 需要添加什么日志来进一步诊断?

第3层: 系统级诊断

分析资源使用、网络、并发等系统问题

Prompt模板:

系统在高负载时变慢,请帮我诊断可能的原因。

环境信息:
- 并发用户数:[数字]
- 当前资源使用:
  - CPU: [百分比]
  - 内存: [使用量]
  - 磁盘: [使用情况]
- 数据库连接池:[配置]

症状:
- 哪些操作变慢了?
- 是否有超时错误?
- 是否有内存溢出?

请分析:
1. 最可能的原因是什么?
2. 如何逐步定位真正的瓶颈?
3. 应该采集什么指标来验证?

📄 常见Bug类型及诊断方向 其他

Bug类型 常见原因 诊断方向
NullPointerException 空引用 检查对象初始化和判空
OutOfMemoryError 内存泄漏或分配不足 分析堆快照,找长期持有的对象
TimeoutException 操作超时 检查网络、数据库、外部API
ConcurrentModificationException 并发修改 检查多线程访问和同步
DatabaseException 数据库问题 检查连接、查询、死锁
OutOfRangeException 数组越界 检查循环边界和索引计算
Performance Degradation 性能下降 分析CPU、内存、I/O、数据库

📄 ✅ 常用诊断工具 其他

Java:

  • jps - 查看Java进程
  • jstack - 线程堆栈
  • jmap - 堆内存快照
  • jstat - JVM统计
  • VisualVM - 可视化监控

Python:

  • pdb/ipdb - 调试器
  • cProfile - 性能分析
  • memory_profiler - 内存分析
  • tracemalloc - 内存追踪

JavaScript/Node.js:

  • console.log/debug
  • Node Inspector
  • Chrome DevTools
  • New Relic/DataDog

通用:

  • strace - 系统调用追踪
  • Wireshark - 网络包分析
  • top/Activity Monitor - 资源监控
  • Logs - 日志分析

📄 🔧 调试技巧 其他

技巧1: 二分查找法定位问题

如果代码很长,用二分法快速定位:
1. 注释掉一半的代码
2. 问题消失了→问题在这一半
3. 问题还在→问题在另一半
4. 重复直到定位到具体行

技巧2: 最小化复现用例

Prompt:
"我的这个复杂程序有bug,请帮我创建一个最小化的复现用例。
原始代码:[完整代码]

这段代码的最小化版本应该:
1. 去掉所有不必要的业务逻辑
2. 保留能够复现问题的最少代码
3. 使用简单的数据而不是真实数据

请生成这样的最小化用例"

技巧3: 增加诊断日志

Prompt:
"这段代码在某些情况下会失败,请添加诊断日志帮助排查。
代码:[代码]

需要记录:
1. 函数入口和出口
2. 关键变量的值
3. 条件判断的结果
4. 异常堆栈

日志格式:[指定格式]"

📋 📌 Bug诊断检查清单 检查清单

📄 🎓 下一步 其他

  • 确认bug根因后 → T04: Refactor with Behavior Safety
  • 要写测试防止回归 → T05: Unit Test Generation
  • 需要代码审查 → T07: Code Review Assistant

💬 Prompt 模板 (5)

Bug诊断与根因 - Prompt 1
详情
这是我遇到的错误,请帮我分析:

错误堆栈:
[粘贴完整的错误堆栈跟踪]

错误发生时的操作:[用户在做什么]

问题:
1. 错误的根本原因是什么?
2. 哪一行代码有问题?
3. 为什么会抛出这个异常?
4. 怎样快速修复?
Bug诊断与根因 - Prompt 2
详情
我的应用出现性能问题,以下是日志。请帮我分析:

日志片段:
[粘贴相关日志]

问题现象:
- 响应时间:[多长]
- 错误频率:[多久发生一次]
- 影响范围:[影响哪些用户或操作]

请分析:
1. 从日志看问题发生的顺序是什么?
2. 可能的瓶颈在哪里?
3. 需要添加什么日志来进一步诊断?
Bug诊断与根因 - Prompt 3
详情
系统在高负载时变慢,请帮我诊断可能的原因。

环境信息:
- 并发用户数:[数字]
- 当前资源使用:
  - CPU: [百分比]
  - 内存: [使用量]
  - 磁盘: [使用情况]
- 数据库连接池:[配置]

症状:
- 哪些操作变慢了?
- 是否有超时错误?
- 是否有内存溢出?

请分析:
1. 最可能的原因是什么?
2. 如何逐步定位真正的瓶颈?
3. 应该采集什么指标来验证?
Bug诊断与根因 - Prompt 4
详情
Prompt:
"我的这个复杂程序有bug,请帮我创建一个最小化的复现用例。
原始代码:[完整代码]

这段代码的最小化版本应该:
1. 去掉所有不必要的业务逻辑
2. 保留能够复现问题的最少代码
3. 使用简单的数据而不是真实数据

请生成这样的最小化用例"
Bug诊断与根因 - Prompt 5
详情
Prompt:
"这段代码在某些情况下会失败,请添加诊断日志帮助排查。
代码:[代码]

需要记录:
1. 函数入口和出口
2. 关键变量的值
3. 条件判断的结果
4. 异常堆栈

日志格式:[指定格式]"