《软件调试修炼之道》的原文摘录

  • Debugging sessions are ephemeral; tests are permanent. (查看原文)
    大头 2011-11-12 19:51:28
    —— 引自第41页
  • * 调试不仅是排除缺陷 * Steps * 弄清楚软件为什么会运行有问题 * 修复问题 * 避免破坏其他部分 * 保持或者提高代码的总体质量 * 可读性 * 架构 * 测试覆盖比率 * 性能 * 确保同样的问题不会在其他地方发生,也不会再次发生 * Important * 查明问题的根本原因 * 实证方法 * 构建实验,观察結果 * 核心调试过程 * 问题重现 * 找一个可靠并简洁的方式来按需求重现问题 * 问题诊断 * 提出假设,并通过实验来测试它们,直到找出引起缺陷的潜在原因 * 缺陷修复 * 设计和进行一些修改来修复问题,不要引入回归问题,保持和提高软件的整体质量 * 反思 * 吸取教训 * 哪里出了问题 * 是否还有其他类似问题 * 如何才能确保同样的问题不再发生 * 调试是一个反复的过程 * Before you debug * 需要明白的问题 * 需要知道要找的是什么 * 发生了什么,应该发生什么 * 一次一个问题 * 先检查简单的事情 * HowToDo * 一定需要做到 * 找到软件运行异常的原因 * 修复问题 * 避免破坏其他程序 * 保持或提高软件的整体质量 * 确保不在其他地方发生同样的... (查看原文)
    PC喵鹏桑 2020-12-11 12:38:23
    —— 引自章节:第1 章 山重水复疑无路  2
  • 1. 重现问题 2. 重现第一,提问第二 * 明确开始要做的事 * 抓住重点 * 软件本身 * 软件的运行环境 * 提供的输入 3. 控制软件 * 自动化构建 * 版本正确 4. 控制环境 * 影响软件运行的各种要素 * Tools * 硬件抽象 * 虚拟机 5. 控制输入 * 推測可能的输入 * 回溯工作 * 探测可能的输入 * 边界值分析 * 分支覆盖 * 利用错误的条件 * 引入随机性 * 生成模糊器 * 变异模糊器 * 记录输入值 * Log * 负载与压力 * Log * 负载测试工具 6. 改进问题的重现 * 最小化反馈周期 * 目标:快速地运行大量的实验 * 尽可能简单 * 最大限度地减小所需的时间 * 将不确定的缺陷变为确定的 * 开始于不可知的初始状态 * AllocTool * 与外部系统进行交互 * 精确控制从外部系统接收了什么 * Log * 故意使用随机性 * Log * 多线程 * 自动化 * Test * Log * 迭代 * 改进重现 * http://pic.yupoo.com/q... (查看原文)
    PC喵鹏桑 2020-12-11 12:38:23
    —— 引自章节:第2 章 重现问题  9
  • 1. 诊断 2. 不要急于动手——试试科学的方法 * 兼顾创造性与严密性 * 不同类型的实验 * 检查软件内部状态的某个方面 * Run * Run by debug * 改变软件运行的某个方式 * IO * Arguments * 改变软件本身编码的逻辑 * 实验必须起到验证的作用 * 每次只做一个修改 * 记录所做的调试 * 定期回顾已经尝试的实验和学到的东西 * 不要忽略任何细节 3. 相关策略 * 插桩 * log * 分而治之 * 利用源代码控制工具 * 聚焦差异 * 向他人学习 * 奥卡姆的剃刀 * 其它条件相同的情况下,最简单的解释是最好的 4. 调试器 5. 陷阱 * 你做的修改是正确的吗 * 验证假设 * 多重原因 * 流沙 * 面对一个不断变化的系统,停下手头工作并弄清楚是什么在变化,为什么变化 6. 思维游戏 * 旁观调试法 * 解释问题会帮助你理清思路 * 角色扮演 * 换换脑筋 * 让潜意识帮助你 * 做些改变,什么改变都行 * 福尔摩斯原则 * 当你排除了一切不可能后,无论结论是什么,它也一定是真相 * 坚持 7. 验证诊断 * 向其他人解释你的诊断。 * 检查源代码的原始副本 * 用其它方式验证你的诊断 * 多和他人讨论 8. HowToDo * 构建假设,并用实验来测试它们 ... (查看原文)
    PC喵鹏桑 2020-12-11 12:38:23
    —— 引自章节:第3 章 诊断  30
  • 1. 修复缺陷 2. 清除障碍 * 从一个干净的代码树开始 3. 测试 * 首先确保所有的测试都是通过的 * 在设计你的修复前,确保你已经知道如何进行测试了 4. 修复问题产生的原因,而非修复现 5. 重构 * 修改与重构不要同时进行 6. 签入 * 一次逻辑修改只做一次签入 * 在checkin前进行比较 7. 审查代码 8. HowToDo * 缺陷修复的目标 * 修复问题 * 避免引入回归 * 维持或提高代码的整体质量 * 从一个干净的源代码树开始 * 确保通过测试后再做修改 * 明确在做出更改前如何进行测试 * 针对缺陷的原因而不是现象进行修复 * 要做重构,但不要与功能修改同时进行 * 一次逻辑修改只做一次签入 (查看原文)
    PC喵鹏桑 2020-12-11 12:38:23
    —— 引自章节:第4 章 修复缺陷  51
  • 1. 反思 2. 这到底是怎么搞的 3. 哪里出了问题 * 我们已经做到了吗 * 根本原因分析 * 原因归属 * 需求 * 架构和设计 * 测试 * 构造 * Code * library使用 * 工具使用 * IDE * Compiler 4. 它不会再发生了 * 自动验证 * 重构 * 过程 6. 关闭循环 * 反馈问题 * 记录备案 7. HowToDo * 花时间进行根本原因分析 * 在过程的哪个点上产生了错误 * 出什么错了 * 确保同样的问题不会再发生 * 自动检查是否存在问题 * 重构代码以避免不当使用 * 和同事交谈,适当修改进程 * 多方反馈,与其他利益相关者形成闭环 (查看原文)
    PC喵鹏桑 2020-12-11 12:38:23
    —— 引自章节:第5 章 反思  60
  • * 发现代码存在问题 * * 追踪缺陷 * * * 缺陷追踪系统 * * * 怎样才能写出一份出色的缺陷报告 * * * * 具体、明确、详细 * * * * 最小化的、唯一的 * * * 环境和配置报告 * * * * AutoGain * * 与用户合作 * * * 简化流程 * * * * 明确说明如何报告一个流程 * * * * 自动化 * * * * 提供多种选择 * * * * * Email * * * * * Talk * * * * 要尽量简单 * * * * 模板不要太死板 * * * * 尊重用户的隐私 * * * 有效的沟通 * * * * 心智模式 * * * * * 从用户的角度去沟通 * * * * 和非技术人员沟通 * * * * 发布你的缺陷数据库 * * * * 提供反馈 * * * * 与用户交流 * * 与支持人员协同工作 * * HowToDo * * * 充分利用缺陷跟踪系统 * * * * 复杂度要适中,根据具体情况作出选择 * * * * 直接面向用户 * * * * 自动化环境和配置报告,以确保报告的准确性 * * * 缺陷报告要达到如下目标 * * * * 具体的 * * * * 明确的 * * *... (查看原文)
    PC喵鹏桑 2020-12-12 14:23:46
    —— 引自章节:第二部分 从大局看调试
  • * 特殊案例 * * 修补已经发布的软件 * * * 需要集中精力减少风险 * * 向后兼容 * * * 确定你的代码有问题 * * * 解决兼容性问题 * * * * 提供迁移方法 * * * * 实现一个兼容模式 * * * * 提供预警 * * * * 不修复缺陷 * * 并发 * * * 简单与控制 * * * 修复并发缺陷 * * 海森堡缺陷 * * * 一个当你开始寻找的时候就会"消失"的缺陷 * * * 减少信息收集对系统的影响 * * 性能缺陷 * * * 寻找瓶颈 * * * * Profile * * * 准确的性能分析 * * * * 版本一致 * * * * 运行环境一致 * * * * 测试数据具有典型性 * * 嵌入式软件 * * * 嵌入式调试工具 * * * * 仿真 * * * * 远程调试 * * * * 开发硬件 * * * * ICE * * * 提取信息的痛苦路程 * * 第三方软件的缺陷 * * * 不要太快去指责 * * * * 首先怀疑自己的代码 * * * 处理第三方代码的缺陷 * * * 开源代码 * * HowToDo * * * 在修补已经发布的软件的时候,要集中精力减少风险 * * * 在修复缺陷的过程中不断监测兼容性问题 * * * 确保... (查看原文)
    PC喵鹏桑 2020-12-12 14:24:25
    —— 引自章节:第三部分 深入调试技术
  • * SCM * * CVS * * svn * * git * * mercurial * * bazaar * BugTracker * * bugzilla * * Trac * * Redmine * Code * * sourceforge * * github * Build * * Make * * autoconf * * Jam * * Boost.Build * * SCons * * Ant * * Maven * * Capistrano * CI * * CruiseControl * * Hudson * Libraries * * Test * * * JUnit * * * TestNG * * Memory Allocator * * * libcwd * * * VC * * * Mudflap * * * Dinkumware * * * ElectricFence * * Log * * * log4j * * * Logback * Tools * * Test * * * FitNesse * * * Watir * * * Selenium * * * Sahi * * * The Grinder * * * JMeter * * * QuickTest Professional LoadRunner * * * Peach Fuzzing Platform * * * RFu... (查看原文)
    PC喵鹏桑 2020-12-12 14:25:33
    —— 引自章节:附录A 资源  148