Shift+F5 是 VS Code 中终止调试会话的最直接方式,它彻底中止程序运行、关闭调试器连接并清空所有调试状态,而非暂停。

按 Shift+F5 立即停止调试会话
VS Code 中最直接、最常用的中途退出方式就是 Shift+F5。它会终止当前调试进程,关闭所有调试器连接,并清空变量面板、调用堆栈等状态。注意:这不是“暂停”,而是彻底中止——程序会立即退出运行,不会执行后续任何代码。
常见错误现象包括:你点了 Stop 按钮但界面卡住、调试控制台仍显示 “正在停止调试”;这通常发生在调试远程进程、Node.js 子进程或未正确处理信号的 Python 进程时。
- 若使用
debugpy调试 Python,Shift+F5会向 debugpy 发送终止请求,但若目标进程已卡死或陷入系统调用,可能需手动 kill 进程(如ps aux | grep python+kill -9) - 调试 Node.js 时,
Shift+F5一般能干净退出;但若用了child_process.fork()启动子进程且未监听exit,子进程可能残留 - 在 Jupyter Notebook 中调试单元格时,
Shift+F5只终止当前调试会话,不会中断内核——需单独点击“重启内核”按钮
重启调试不是“重新运行”,而是重置整个调试上下文
Ctrl+Shift+F5(或点击工具栏的 Restart 按钮)会先执行一次 Stop,再按当前 launch 配置重新启动调试器。它不等于手动点两次 F5,因为会清空断点命中计数、条件断点状态、日志点输出历史等临时调试元数据。
使用场景有限但关键:比如你改了代码后想重跑训练循环,但发现变量面板里还留着上一轮的 loss 值,或者某个条件断点(如 epoch == 10)已被触发过、需要重新计数——这时必须 Restart,而不是只按 F5 继续。
- 重启不会自动保存文件;若你修改了代码但没手动保存(或禁用了 auto-save),
Restart仍会加载旧版本 - 对带参数的调试配置(如
"args": ["--mode=train"]),Restart会严格复用 launch.json 里的原始参数,不会记住你上次在 Debug Console 里手动改过的值 - 某些扩展(如 Cortex Debugger)在
Restart时会重连硬件设备;而普通F5可能复用已有连接,导致状态不一致
别把 Pause 当 Stop,也别依赖 Continue 跳出死循环
F5 键在调试中是双态的:运行时显示为 Continue,暂停时变成 Pause。很多人误以为点 Pause 就能“退出”,其实它只是冻结当前线程执行位置,所有变量、堆栈、定时器、网络连接都维持原状——你随时能点回去继续跑,根本没退出。
更危险的是,在死循环里狂按 F5 或 F10,指望靠“单步跳过”逃出来。实际结果往往是:UI 假死、CPU 占满、VS Code 无响应,最后只能强制杀进程。真正该做的是立刻按 Shift+F5,或在代码里提前加个可中断的守卫逻辑(如 if time.time() - start > 30: break)。
- Python 中
while True:循环无法被Pause及时捕获,除非解释器有机会返回控制权(比如中间有time.sleep()或 I/O) - JavaScript 的
while(true)会让整个渲染线程锁死,Pause按钮甚至来不及响应——此时唯一办法是关掉浏览器标签页或重启 VS Code - 如果你常遇到这类问题,建议在 launch.json 里加
"timeout": 10000(单位毫秒),让调试器超时自动中断
Stop 和 Restart 的底层行为差异容易被忽略
VS Code 的 Stop 实际发的是调试协议里的 disconnect 请求,而 Restart 是 disconnect + launch(或 attach)两步。这意味着:如果 launch.json 里用了 "preLaunchTask",Restart 会再次执行该任务(如重新编译 C++),但 Stop 不会触发任何构建流程。
另一个隐性影响是端口复用:Node.js 调试默认用 9229 端口,Stop 后端口立即释放;但若 Restart 太快,新进程可能抢不到端口,报错 EADDRINUSE。这时要检查 launch.json 是否设了 "port": 0(让系统自动分配)或加 "restart": true(启用热重载而非全量重启)。
- 调试 Flask/FastAPI 时,
Stop不会关闭后台 dev server,Restart才会重新启动服务实例 - 使用
attach模式调试已运行进程时,Stop是 detach(脱离),Restart则会尝试重新 attach——如果目标进程已退出,就会失败 - 所有自定义的
postDebugTask只在Stop后触发,Restart不会执行它


















