remoteRoot必须严格匹配远程实际路径,否则断点失效;需进虚拟机用pwd确认路径,与devcontainer.json挂载target、sourceMap中sources字段三者完全对齐,并确保Node监听0.0.0.0且端口转发配置正确。

launch.json里remoteRoot写错,断点全变空心圆
VSCode远程调试Node.js时,remoteRoot必须严格匹配容器或虚拟机内代码实际所在路径,否则源码映射失败,断点不生效。常见错误是直接照抄本地路径,比如本地在/Users/me/project,但虚拟机里挂载到了/home/vagrant/app,却还写"remoteRoot": "${workspaceFolder}"。
-
remoteRoot不是“你希望它在哪”,而是“它真正在哪”——得进虚拟机用pwd确认当前工作目录 - 如果用Vagrant + VirtualBox,默认共享文件夹通常挂载到
/vagrant,但你的package.json可能在/vagrant/src下,那remoteRoot就得填/vagrant/src - 别依赖
${localWorkspaceFolder}自动推导,这个变量只对本地有效,远程调试时它不会被解析 - 验证方式:在虚拟机里运行
node --inspect-brk index.js,然后在VSCode里打开调试面板,看“CALL STACK”里显示的文件路径前缀是不是和remoteRoot一致
devcontainer.json挂载路径和remoteRoot不一致,调试器找不到源码
用Remote-Containers时,devcontainer.json里的mounts定义了本地代码怎么进容器,而launch.json里的remoteRoot必须和这个target完全对齐。两者差一个子目录,source map就对不上。
- 例如
mounts里写"target":"/workspaces/myapp",那remoteRoot就得是/workspaces/myapp,不能是/workspaces或/workspaces/myapp/src - 如果项目结构是
myapp/src/index.js,且program指向"${workspaceFolder}/src/index.js",那remoteRoot仍应是/workspaces/myapp,因为${workspaceFolder}对应的是整个挂载根 - 检查挂载是否成功:进容器执行
ls -l /workspaces/myapp,确认能看到package.json和src目录 - Windows宿主机用户注意:
${localWorkspaceFolder}带盘符(如C:\project),但Linux容器里没有C:,所以mounts必须用正斜杠路径,且remoteRoot必须是Linux风格绝对路径
虚拟机里Node进程监听127.0.0.1,VSCode连不上调试端口
默认node --inspect只绑定127.0.0.1,虚拟机内部能连,但VSCode从宿主机发起连接会超时。这不是路径问题,但常被误认为映射失败。
- 启动命令必须加
--inspect=0.0.0.0:9229,而不是默认的--inspect或--inspect-brk -
launch.json里address字段要设为"0.0.0.0",不能留默认"localhost" - Vagrantfile里得开转发端口:
config.vm.network "forwarded_port", guest: 9229, host: 9229 - VirtualBox网络模式选“NAT”时,仅靠端口转发不够,还得在虚拟机里关防火墙:
sudo ufw disable(Ubuntu)或sudo systemctl stop firewalld(CentOS)
sourceMap路径在虚拟机里解析失败,TS断点失效
TypeScript编译后生成的.map文件里存的是相对路径,如果虚拟机里工作目录和本地不一致,VSCode就找不到原始.ts文件。
- 确保
tsconfig.json里outDir和rootDir明确,且sourceMap为true - 编译命令统一用
tsc -b,避免不同环境tsc版本差异导致sources字段写错 - 在
launch.json里加"resolveSourceMapLocations": ["${workspaceFolder}/**","!./node_modules/**"],强制VSCode在指定范围内找.map对应文件 - 最保险的做法:把
sourceMap设为"inline",让map内容直接塞进.js里,绕过路径解析
虚拟机环境的路径映射不是“配对就行”,而是三处必须咬合:挂载路径、remoteRoot、sourceMap里的sources字段。少一处对齐,断点就悬空。别信自动推导,每个路径都进虚拟机pwd和cat *.map | head -n5手动核对一遍。


















