断点必须打在实际执行的代码路径上,否则不会触发;常见原因包括代码未执行、被优化跳过、sourceMap未启用、launch.json配置错误、作用域不匹配。

断点加在哪,程序才真会停
断点不是点哪停哪——它只在调试器实际加载并执行的代码路径上生效。常见现象是:红点明明打了,F5一按却直接跑完,没停。根本原因往往是代码根本没走到那行,或者被优化跳过了。
- 别在
if(false)里设断点;也别在Promise.then()外层函数体开头就盯response,它此时还是undefined - 异步回调、事件处理器、定时器内部,才是该设断点的地方;比如
setTimeout回调第一行、fetch().then()的箭头函数内 - Node.js 调试时加
"runtimeArgs": ["--no-opt"]到launch.json,防止 V8 把带断点的函数内联或移除 - TypeScript 或打包项目中,确保
sourceMaps: true已启用,否则断点打在.ts文件却对不齐运行时位置
launch.json 配不对我就白按 F5
launch.json 不是可有可无的配置文件,它是 VS Code 知道“怎么启动、连谁、读哪份代码”的唯一依据。缺了、写错路径、type 和已装扩展不匹配,都会导致“没有可用的调试配置”或断点灰掉。
- Python 项目必须选对解释器:右下角点 Python 版本 → 选已安装的
python3.x路径,否则F5启动的是系统默认(可能根本没装) - Node.js 项目确认
"type": "pwa-node"(新版推荐),且"program"指向真实入口,比如"${workspaceFolder}/index.js",不是./src/index.ts - 前端页面调试要配
"type": "pwa-chrome",并提前用--remote-debugging-port=9222启动 Chrome,否则连不上 - 用
python -m http.server这类命令启动的服务,不能用launch模式,得切到attach模式,否则调试器根本找不到进程
变量看不清?别硬翻,用对地方
“变量”面板显示的是当前栈帧的作用域快照,“监视”(Watch)和“调试控制台”才是动态求值的工具。很多人卡在展开十层对象找 data.items[0].name,其实一行表达式就能解决。
- 想查深层属性,直接在 Watch 面板输
user?.profile?.name或JSON.stringify(errors, null, 2),别手动一层层点开 - 调试控制台(
Ctrl+Shift+Y)里输count = 99可实时改值,但改完得按F5继续,否则后续逻辑仍用旧值 - Watch 表达式报
Cannot access 'xxx' before initialization?说明变量还没声明,这时回看“变量”面板,确认当前是否在正确函数作用域内 - 别依赖
console.log——右键断点 → “编辑断点” → 输入当前值: ${i}, 数组长度: ${arr.length},就是日志点,不暂停、不污染源码
调试控制台不是只看值,还能临时改逻辑
调试控制台不只是“查看器”,它是运行时沙盒:能调函数、发请求、改环境变量,效果立刻反映在后续执行中。但它的能力受限于当前上下文和语言运行时支持。
- Node.js 中输
process.env.DEBUG = "true",可即时开启模块内部 debug 日志 - 浏览器环境输
fetch("/api/test"),只要没跨域拦截,请求真会发出去,响应也能看到 - JavaScript 中输
user.name = "Test"修改对象属性,下一行console.log(user.name)就会输出新值 - 注意副作用:在控制台调用
localStorage.clear()或document.body.innerHTML = "",页面真会变——这不是模拟,是真实操作
launch.json 路径、sourceMap 映射、作用域上下文——这四点任一出错,调试就变成“看着红点干瞪眼”。很多人反复重启 VS Code,其实问题就在刚打开的那几行 JSON 里。









