-调试 Lecture 7 - Debugging
-调试 Lecture 7 - Debugg
掌握断点机制、调用栈追踪与边界 Bug 的排查逻辑
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
-调试 Lecture 7 - Debugg
掌握断点机制、调用栈追踪与边界 Bug 的排查逻辑
Lecture 7 Introduction
你写的代码逻辑看着对,结果却错——说明你的「心智模型」和程序的「实际行为」之间有缝隙。调试,本质上是在这条缝隙上架桥。
主诉=症状;查体=日志;化验=单步;诊断=定位根因;治疗=修复
Testing and Debugging
写完作业通读一遍检查——这是 testing;发现第3题算错了,翻回去找错在哪——这是 debugging。两者谁也替不了谁。
质检员按标准主动扫描找缺陷,维修工凭工单根治故障
Test Suites
上页我们讲了 testing 和 debugging 的关系——测试是为了尽早抓 bug。但一个真实项目动辄几百上千个测试用例,怎么组织?怎么挑着跑?这就要用「测试套件」。
基础套餐/心脏专项 对应 不同套件;多项检查共享前后准备(空腹、登记);结果按套餐汇总
Black-Box Testing
上几页我们谈了「先写测试再写代码」以及测试套件的组织。但每个测试用例具体怎么写?有一种视角:你完全不知道程序内部长什么样,只管喂输入、看输出对不对——这就是黑盒测试。
顾客只看菜品对不对味,不知后厨怎么做;测试者只看输入输出对不对,不知代码怎么实现
Glass-Box Testing
上一页黑盒测试把程序当成密封的盒子,只看输入输出。玻璃盒测试反其道而行——打开盒子看代码,按内部的脉络去决定怎么测。
试驾=黑盒只知能否跑;拆开=白盒逐个零件验
Test Drivers and Stubs
白盒测试能看清一个模块的内部逻辑,可它只回答『这段代码对不对』,回答不了『它和别的模块拼起来对不对』。模块还没拼好时,怎么单独测它?
台架(驱动)供油读转速;假变速箱(桩)假装被带动;发动机就是被测模块。
Debugging
测试告诉你「这里出了问题」,但代码里有百万行——真正困难的是:问题在哪?为什么发生?怎么改?
案发现场=测试失败,证词=日志线索,侦探要从结果回溯到作案手法
Debugging as Search
你已经知道调试要系统化。但还有更本质的视角:调试其实是一个搜索问题——在一个由症状、位置、原因组合成的巨大空间里,把搜索范围一步步压到唯一那条正确路径上。
现场线索=程序症状,嫌疑人=可能成因,推理排查=假设检验,锁定真凶=定位bug
本节要点
- ✓测试找 Bug,调试找根因,方向不同
- ✓测试要兼顾黑盒规格与白盒路径
- ✓桩与驱动让不可执行的代码也能测
- ✓调试本质是带证据的搜索,不是猜
- ✓先定位根因再改代码,别急着动刀
课后思考
先自己思考再对照参考答案——三个问题分别考察回顾、应用与迁移。
参考答案调试搜的不是'bug',而是程序状态空间——哪些代码路径、输入数据可能产生这个症状。结合二分定位和症状、堆栈、日志等线索缩小范围。
参考答案间歇失败往往根植于时序、资源或并发等非确定性因素。先多跑黑盒复现,若仍无法稳定触发,则需白盒插桩(print、assert、断点)观察内部状态定位触发条件。
参考答案可以,对照替换是合法调试手段。前提是接口、状态、副作用与原模块一致;症状消失则定位成功,否则继续上溯。