断点不生效主因是launch.json配置错误,尤其是program字段未指向真实可执行路径、解释器未选对虚拟环境、或sourcemaps未启用;需按运行方式匹配program/module、确认cwd、检查justmycode设置。

launch.json 配置不对,断点就永远不生效——这是 VSCode 调试失败最常见、也最容易被忽略的根源。
断点不命中?先看 launch.json 里 program 是否指向真实可执行路径
断点变为空心红点,或按 F5 后程序直接跑完没停,大概率是 launch.json 的 program 字段写错了。它不能只写 "${file}" 就完事,得确认这个文件真能被调试器加载执行。
- Python:必须指向一个 .py 文件,且该文件需包含可执行逻辑(比如有
if __name__ == "__main__":);若用虚拟环境,还要确保python解释器路径正确,可通过右下角Select Interpreter确认 - Node.js:
program应为"./dist/index.js"这类已构建产物,不是./src/index.ts;否则 source map 缺失会导致断点错位 - TypeScript/前端项目:必须开启
"sourceMaps": true,且构建工具(如 webpack、vite)输出中要包含.map文件,否则调试器找不到源码对应关系
变量看不清?别只靠悬停,用 WATCH 面板手动加表达式
鼠标悬停只能显示基础类型和浅层对象,对 Promise、Map、深层嵌套字段(如 res.data.items[0].id)基本无效,容易误判变量状态。
- 在调试侧边栏点击
WATCH区域的+号,输入完整表达式,比如error.stack或Array.from(mySet) - 对异步值,可输入
await myPromise(需在调试控制台,而非 WATCH)来强制求值 -
VARIABLES面板默认折叠对象属性,点击箭头展开后仍可能卡住;WATCH 是唯一能稳定触发深度计算的地方
条件断点失效?检查作用域、优化与表达式语法
右键断点选“编辑断点”后填了 i > 1000 却没停,问题往往不在逻辑,而在执行上下文。
- 变量
i必须在当前断点所在作用域内声明,循环外定义的let i在 for 循环体内才可见;用var声明可能因提升导致行为异常 - JavaScript 中启用
"skipFiles"或生产构建时的代码压缩(如 terser)会移除变量名,让条件表达式找不到引用 - 表达式必须返回布尔值,
console.log(i)这类语句不能用;日志断点需单独勾选“Log Message”,不能混在条件框里
远程调试连不上?重点查 remote.ssh.logLevel 和插件安装位置
本地 VSCode 看起来一切正常,但远程服务器上没反应,90% 是调试适配器根本没装过去。
- Remote-SSH 模式下,所有语言扩展(如 Python、js-debug)必须在远程端重新安装——本地装了没用
- 在
settings.json中加这行:"remote.ssh.logLevel": "debug",然后打开“输出”面板,切换到Remote - SSH通道,看是否有Could not find debug adapter - 如果日志里出现
Permission denied (publickey),说明 SSH 密钥没代理转发,需在~/.ssh/config中加ForwardAgent yes
真正卡住人的从来不是功能不会用,而是断点不命中的时候还在改业务逻辑,变量看不清的时候还在猜数据结构,远程连不上时还在重装本地插件。把 launch.json 路径、WATCH 表达式、远程插件位置这三处盯死,大部分“调试失灵”问题就消失了。











