VSCode 调试怎么配?launch.json 配置和断点调试实战
VSCode 的调试器支持 Node.js、Python、C++、Java 等主流语言。核心配置文件是 .vscode/launch.json,定义调试的启动方式和参数。
最快上手:不用写配置
很多语言不需要手写 launch.json:
- Node.js:打开 JS 文件,按 F5,VSCode 自动以当前文件启动调试
- Python:装 Python 扩展后,打开 .py 文件按 F5 自动调试
- HTML:装 Live Server 扩展,右键 "Open with Live Server" 在浏览器调试
如果自动检测不对,按 F5 后从弹出的环境列表中选择。
手动配置 launch.json
需要精细控制时,创建 .vscode/launch.json:
json{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Debug Server", "program": "${workspaceFolder}/src/index.ts", "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "env": { "NODE_ENV": "development" }, "console": "integratedTerminal" }, { "type": "node", "request": "attach", "name": "Attach to Process", "port": 9229, "restart": true } ] }
两种 request 模式:
- launch:VSCode 启动程序并附加调试器
- attach:程序已经在运行,VSCode 附加到进程上调试(适合调试 Docker 容器或远程进程)
常用调试操作
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 开始/继续 | F5 | 启动调试或继续运行到下一个断点 |
| 单步跳过 | F10 | 执行当前行,不进入函数内部 |
| 单步进入 | F11 | 进入函数内部 |
| 单步跳出 | Shift+F11 | 跳出当前函数 |
| 停止 | Shift+F5 | 终止调试 |
| 重启 | Ctrl+Shift+F5 | 重启调试会话 |
断点类型
普通断点:点击行号左侧的空白区域设置。
条件断点:右键行号选 "Add Conditional Breakpoint",输入条件表达式(如 i === 50)。只有条件为 true 时才暂停,调试循环时很有用。
日志断点:右键选 "Add Logpoint",输入日志文本(如 Current value: {variable})。不暂停程序,只在控制台打印——比 console.log 干净,不改代码。
命中计数断点:条件断点里设置 hit count(如 5),第 5 次执行到才暂停。适合循环中某次迭代出问题的场景。
调试面板
暂停时左侧出现三个面板:
- Variables:当前作用域的局部变量和全局变量,可以展开对象查看属性
- Watch:自定义监视表达式,实时计算值
- Call Stack:调用栈,点击任意帧跳转到对应代码位置
Variables 面板可以直接修改变量值——双击数值输入新值,继续运行时会用新值。调试算法逻辑时非常有用。
调试远程/容器程序
Docker 容器:在 launch.json 里配 attach 模式,指向容器暴露的调试端口:
json{ "type": "node", "request": "attach", "name": "Docker Attach", "port": 9229, "address": "localhost", "localRoot": "${workspaceFolder}/src", "remoteRoot": "/app/src", "restart": true }
localRoot 和 remoteRoot 做路径映射——VSCode 用本地路径显示代码,但调试器用容器内的路径。restart: true 在容器重启后自动重新连接。
常见问题
断点不生效(灰色圆圈):代码和编译产物不一致。确保构建后再调试,或配 preLaunchTask 自动构建。
无法 attach 到进程:目标进程必须以调试模式启动。Node.js 加 --inspect 参数,Python 加 -m debugpy --listen 5678。
调试时跳进了 node_modules:在 launch.json 里加 "skipFiles": ["<node_internals>/**", "node_modules/**"],调试时自动跳过这些文件。