launch.json 应通过vscode齿轮图标自动生成,确保调试扩展已安装、环境就绪、program路径正确;手动编写易遗漏env/cwd/prelaunchtask等关键字段。

launch.json 别手写,用齿轮图标自动生成
VSCode 调试器本身不带运行时,launch.json 是否生效,取决于三件事:对应语言的调试扩展已安装、项目环境就绪(比如 python 可执行、g++ 在 PATH 中)、program 字段指向真实可执行入口。手动写容易漏掉关键字段,比如 env、cwd 或 preLaunchTask,导致断点不触发或路径报错。
正确做法是:打开「运行和调试」侧边栏(Ctrl+Shift+D),点击顶部齿轮图标 ⚙️,VSCode 会根据你已装的扩展(如 Python、C/C++、Go)自动列出模板。选中后生成的 launch.json 带完整注释,且字段语义明确。
- 如果没看到目标语言选项,说明对应扩展没装或没启用(比如 Go 需要
Go扩展,不是Debugger for Go) - 生成后务必检查
"program":Python 项目常用"${file}",C++ 必须填编译后的二进制路径(如"${workspaceFolder}/build/hello") - Node.js 或 Python 脚本若依赖工作目录,必须设
"cwd": "${workspaceFolder}",否则open("config.json")会找不到文件
断点不命中?先查 sourcemap、service worker 和编译产物
断点显示为空心圆、悬停无响应、F5 后直接跑完——这不是 VSCode 坏了,而是调试链路某处脱节。常见原因和验证方式很具体:
-
sourcemap缺失:TypeScript/前端项目必现。确认构建命令加了--source-map(Webpack/Vite)或tsconfig.json中"sourceMap": true - Service Worker 缓存:浏览器端调试 JS 时,旧版 SW 可能拦截请求,导致断点加载的是缓存代码。在 DevTools 的 Application → Service Workers 中勾选
Update on reload并强制刷新 - C/C++ 断点失效:90% 是没加
-g编译参数。检查tasks.json的"args"是否含"-g";若用 CMake,确保set(CMAKE_BUILD_TYPE Debug) - Python 模块未安装到当前解释器:
ModuleNotFoundError不影响断点,但会导致启动失败。右下角确认解释器路径,再用该解释器执行pip install -e .
变量看不准?别只靠悬停,用 Variables 面板和 Debug Console
鼠标悬停变量有时显示 undefined 或旧值,尤其在异步回调、闭包或优化后的 JS 中。VSCode 的 Variables 面板(调试侧边栏第二项)和 Debug Console 更可靠,因为它们读取的是调试器实时注入的上下文。
-
Variables面板可展开作用域(Local、Closure、Global),比悬停更全;右键变量支持「Copy Value」或「Add to Watch」 -
Debug Console支持执行当前作用域代码,比如输入myArray.filter(x => x > 10)查看过滤结果;但注意:执行任意语句都会终止当前调试会话(VSCode 设计如此,非 bug) - 条件断点比手动
if更高效:右键断点 →Edit Breakpoint→ 输入x === null || y.length === 0,调试器只在满足时暂停
Python/C++/Go 调试配置差异在哪?看 type 和 program
不同语言的 launch.json 核心区别就两个字段:"type" 决定用哪个调试扩展,"program" 决定调试什么。填错一个,整个调试流程就卡住。
- Python:
"type": "python","program": "${file}"(当前文件)或"module": "flask"(启动框架);"env"常用于设置FLASK_ENV或DJANGO_SETTINGS_MODULE - C++:
"type": "cppdbg"(GDB/LLDB),"program"必须是已编译的二进制(如"${workspaceFolder}/build/main"),且"miDebuggerPath"一般不用填——扩展会自动找gdb或lldb - Go:
"type": "delve","mode": "exec"对应二进制,"mode": "test"对应单元测试;首次调试会提示安装dlv,必须允许,否则断点无效
真正容易被忽略的是:所有语言都依赖 preLaunchTask 自动构建。C++/Go 项目没配它,F5 就只是运行旧二进制;Python 虽然不用编译,但大型项目仍建议用 preLaunchTask 触发 black 或 mypy 检查——这一步,多数人跳过了。










