按F10单步执行下一行(Step Over),不进入函数内部;按F11进入函数(Step Into),遇内置/C扩展函数则跳过;Shift+F11跳出当前函数;异步代码中F10可能“跳跃”,属正常调度行为。

VSCode调试中断后怎么单步执行下一行
程序在断点处暂停后,想逐行看代码怎么走,直接按 F10 就行。这是最常用、最稳妥的方式,对应调试工具栏的 “Step Over”(单步跳过)按钮。
它会执行当前行,然后停在下一行——但不会进入函数内部。比如遇到 result = calculate(x, y),F10 会直接跑完整个 calculate() 函数,停在它的下一行,不进函数体。
- 适合快速过掉已确认无问题的函数调用
- 对异步回调、装饰器包裹的函数也适用,行为稳定
- 如果当前行是空行或注释,
F10会自动跳到下一个可执行语句
想进函数内部看每一步,该用哪个键
按 F11,即 “Step Into”。它会在遇到函数调用时,主动跳进该函数第一行可执行代码(比如 def 后的第一条语句),而不是跳过。
注意:如果目标函数是内置函数(如 len()、print())或 C 扩展函数(如 NumPy 的多数操作),F11 通常会跳过,退回到 F10 行为——这不是 bug,是调试器无法加载其 Python 源码导致的。
- 只对有 Python 源码且未被优化(
-O)的函数有效 - 若函数里有断点,
F10和F11在该函数内表现一致(都会停在断点) - 误按
F11进入不想看的库函数?按Shift+F11(Step Out)立刻跳出到调用它的那层
为什么按了 F10 却跳到了完全无关的行
常见于异步代码或生成器场景。比如你在 await fetch_data() 上按 F10,控制流可能直接跳到 async with 块末尾,甚至跳到事件循环调度点——这不是跳错,而是 await 本质是让出控制权,调试器按实际执行顺序走。
- 这种“跳跃”说明你正在调试协程,不是线性代码
- 想看清 await 后续逻辑,建议在
await行之后的处理代码上设新断点,而非依赖单步 - 使用
console:"integratedTerminal"而非"internalConsole",能更准确反映异步调度时机
单步执行卡住或响应迟缓怎么办
大概率是碰到了日志点(logpoint)、条件断点,或调试器在频繁求值表达式。比如你在循环里设了条件断点 i % 1000 == 0,每次迭代都得算一次,10 万次循环就拖慢明显。
- 检查断点图标:实心红点是普通断点,带
fx图标的是条件断点,带?的是日志点 - 右键断点 → “编辑断点”,删掉复杂条件,或勾选 “仅命中一次”
- 禁用所有断点(
Ctrl+Shift+F9),再逐个启用排查 - 某些扩展(如 Pylance 的实时类型推导)会在单步时触发后台分析,暂时禁用可提速
调试时真正容易被忽略的,是单步行为高度依赖当前上下文:同步/异步、是否含 C 扩展、launch.json 里 console 和 justMyCode 的设置,都会改变 F10/F11 的实际落点。别只记快捷键,要观察“它到底停在哪一行”,再反推原因。











