sourceMap没生效是因为映射链路断裂;断点为空心圆表明VSCode识别到断点但无法将JS行号映射回TS源码,需同时满足:tsconfig.json中"sourceMap":true且"inlineSourceMap":false、launch.json中"sourceMaps":true并精确配置"outFiles"、构建后dist目录下存在.js及对应.js.map文件。

sourceMap 为什么没生效?先看断点是不是空心圆
断点显示为空心红点,基本可以断定 sourceMap 没加载成功。VSCode 看到了断点标记,但找不到对应的原始源码位置——不是插件问题,也不是 VSCode 故障,而是映射链路断了。
常见触发场景:
- TypeScript 项目里断点打在
.ts文件上,但tsconfig.json里没开"sourceMap": true - Webpack/Vite 构建后生成了
.js.map,但launch.json没设"sourceMaps": true -
outFiles路径写错,比如实际输出到dist/,配置却写了build/ - 用了
inlineSourceMap: true,但 Node.js 调试器不支持内联 map(尤其 Python/Node 场景下)
Node.js + TypeScript 必须配对的三处 sourceMap 设置
TypeScript 不是直接运行的,sourceMap 需要编译器、运行时、调试器三方协同。漏掉任何一环,断点就停不住。
检查以下三项是否全部满足:
-
tsconfig.json中必须有:"sourceMap": true,且"inlineSourceMap": false(Node.js 调试器不读内联 map) -
launch.json的 configuration 中必须显式开启:"sourceMaps": true,并指定"outFiles": ["${workspaceFolder}/dist/**/*.js"](路径按你实际构建输出调整) - 确保已执行构建命令(如
tsc或npm run build),dist/目录下存在.js和对应.js.map文件,且.map文件里的sources字段指向的是相对src/的路径(例如["../src/index.ts"])
前端项目(React/Vue)断点映射失败?重点查 sourceMapPathOverrides
Webpack/Vite 打包后的路径和本地开发路径经常不一致,sourceMap 里记录的 webpack:///./src/App.tsx 这类虚拟路径,VSCode 默认不认识,必须手动映射。
在 launch.json 对应的浏览器调试配置中加这一段:
"sourceMapPathOverrides": {
"webpack:///./src/*": "${webRoot}/src/*",
"webpack:///src/*": "${webRoot}/src/*",
"webpack:///./~/*": "${webRoot}/node_modules/*"
}
注意:
-
webRoot必须准确指向你项目的根目录(通常用${workspaceFolder}) - 如果用了 Vite,且启用了
resolve.alias,比如@/指向src/,那sourceMapPathOverrides里也得补上"webpack:///@/*": "${webRoot}/src/*" - 映射规则是正则前缀匹配,顺序重要:更具体的规则放前面,避免被泛匹配覆盖
C/C++ 调试时断点偏移?-g 编译参数和路径对齐缺一不可
C 程序断点停在错误行号、变量名显示为 _a 或 __zz_cib_Delegator,大概率是 sourceMap 类机制(即调试信息)缺失或路径错位。
关键动作只有两个:
- 编译时必须带
-g参数(tasks.json的args数组里加"-g"),否则生成的可执行文件里根本没有行号信息 -
launch.json中的program字段路径,必须和tasks.json输出的可执行文件路径完全一致;若用cd build && make,program就不能写成${workspaceFolder}/main,而得是${workspaceFolder}/build/main - Windows 下若用 MinGW-w64,确认
miDebuggerPath指向的是gdb.exe(不是gdb-python.exe或其他变体)
复杂点在于:C 项目没有统一的构建标准,sourceMap 的等价物(DWARF/PE 调试信息)是否嵌入、是否被剥离、路径是否被重写,全取决于你用的编译器和 CMake/Makefile 配置。一旦出问题,优先比对 readelf -w ./a.out(Linux)或 dumpbin /headers(Windows)输出里有没有调试节,而不是反复改 launch.json。


















