跳转至

2025 春 · 如何教会同学调试

  • 介绍更系统的调试方法:Delta Debugging(自动简化测试用例,出自 Why Programs Fail Chapter 5)、Statistical Debugging。
  • 材料:Debugging book、fuzzing book、David J. Agans《Debugging: The 9 Indispensable Rules》、G. Aaron Wilkin《Debugging From Art to Science》(列出了教学目标,如描述缺陷如何产生、按可复现/确定性对 bug 分类、阅读和理解大型项目、重现/强制失败的过程、用科学方法搜索 bug、高效利用调试工具、用因果规则修复并证明修复、设计技术/模式以简化未来调试; 并让学生做 bug logbook)。
  • 讨论:自己从哪里学会调试; 同学们学会调试的难点。
  • 自己学会调试:分布式/并行系统难以重现、涉随机; 图形学以输出调试为主; 硬件调试主要看波形(进阶做法如与模拟 ISA 对拍); 最小化代码 / minimal working example 复现; 有人当了助教才自学 gdb, 发现 gdb 这么好用。
  • 同学学会调试的难点:不善于使用搜索引擎; 缺乏 "找中间状态和预期状态是否一致" 的思路(gdb、printf、dump 本质都一样); 本科课程没有系统教过调试; 写码欲望下降、潜意识里想要现成框架, 而从零开始写框架其实是珍贵的调试学习机会。
  • 大语言模型能帮助同学调试吗:讨论并提出了 "出一点反大模型的作业""以足够大的开源项目为学习方法" 等思路。对 "摆烂型" 同学可能遇 bug 直接躺平; 也可能已常驻 copilot/cursor 等工具。
  • 通过作业/文档教会调试的尝试:Stanford CS107e LAB3、清华网络原理调试文档、计算机组成原理错误速查清单、数据结构 "调试辅导课"(前半学期每周一次 20-30 分钟, 分调试概论、代码风格、测例构造三节——因为线下答疑难以克服代码难读、工具不熟、调出后没建立信心等问题); 也有助教给课程加了用 vscode 调试的文档、在 PA 文档里开一节。
  • 调试竞赛:算法竞赛,但是要求限时调代码(Competitive Debugging)。
  • 暖场:自我介绍 + "我最近遇到的一个有趣 bug 是..."(可以是自己写的,也可以是课上的;程设、数电、OS 用户态/内核态切换未考虑浮点寄存器、windows 驱动调试等)。

⇦ 返回 2025 春主页