考前刷题时总卡在某个函数调用后结果不对?代码跑起来就崩,但断点一打又不崩?别急着重写——你可能缺的不是知识点,而是单步跟踪这把手术刀。
什么叫单步跟踪?就是让程序“慢动作”走
它不是看日志、不是猜逻辑,而是让代码一行一行执行,每按一次F8(或F7/F9),就推进一步。变量值怎么变、分支怎么跳、指针指向哪,全在眼前。就像跟着考生答题步骤逐空核对,错在哪一眼就明。
哪些考试场景最吃这一招?
• 指针/引用类题目(C/C++/Java)
比如一道模拟链表反转题,运行结果是空指针异常。单步跟进去,走到current = current->next;那行,鼠标悬停一看——current早就成NULL了,问题出在上一轮循环末尾没判空。比翻十遍课本还快。
• 多线程同步题(Python threading / Java synchronized)
两个线程交替执行却总输出乱序?加个断点在lock.acquire()后,再单步进临界区,立刻发现线程A还没释放锁,线程B就卡在等待队列里——考试常考的“死锁诱因”,当场可视化。
• 递归边界错误(算法题高频坑)
斐波那契递归超时?设断点在if n <= 1: return n,单步进第一次调用,n=5→3→1,再往下n=-1!边界漏了等号,递归根本停不住。这种细节,光看代码容易滑过,单步一走就露馅。
实操:PyCharm里三步抓到考试原题Bug
假设考题要求实现一个字符串去重函数,但返回结果总少字符:
def dedupe(s):
seen = set()
result = []
for c in s:
if c not in seen:
seen.add(c)
result.append(c)
return ''.join(result)在for c in s:这行打个断点,按F9运行,然后疯狂按F8:
→ 第一次c='a',seen={'a'}, result=['a']
→ 第二次c='b',seen={'a','b'}, result=['a','b']
→ 第三次c='a',条件不成立,跳过
→ ……直到最后发现result里确实没重复,但输出是'ab',而预期是'abc'?等等——输入串是不是'abca'?单步走到最后一步,''.join(result)结果确实是'abca'去重后的'abc'。原来错不在代码,在自己手敲测试用例时多打了个'a'……考场慌乱中,这种低级失误太常见,单步能帮你把“以为的输入”和“实际的输入”对齐。
小提醒:考试调试别踩坑
• 不要全程F7(步入)进标准库,考试题99%不考list.append源码,F8(步过)更省时间;
• 变量窗口比print()快十倍,PyCharm右下角“Variables”面板开着,改值、看类型、查长度一目了然;
• 遇到循环卡住?在循环头设断点,按Ctrl+F8(PyCharm)改成“条件断点”,填i == 99,直接跳到第100次迭代看现场。
单步跟踪不是炫技,是把模糊的“好像有问题”变成确定的“这里错了”。下次模拟题跑不通,别先怀疑环境——打开调试器,按F8,让代码自己开口说话。