launch.json必须通过vscode齿轮图标自动生成,不可手写;否则易遗漏cwd、env、prelaunchtask等关键字段,导致断点不触发、路径错误或模块导入失败。

launch.json 必须由 VS Code 自动生成,不能手写——手动拼 JSON 极易漏掉 cwd、env、console 或 preLaunchTask 等关键字段,结果就是断点不触发、ModuleNotFoundError、file not found,或者 F5 后程序直接跑完没反应。
为什么不能手写 launch.json
VS Code 的调试逻辑是:读取 launch.json → 转发配置给对应语言的调试扩展(如 python 扩展调用 debugpy,cppdbg 扩展调用 gdb)→ 由调试扩展真正启动进程并挂载调试器。这个链路里任何一环缺字段,都会导致调试器“听不懂指令”。比如:
-
cwd缺失 → VS Code 在工作区根目录下找program,但你的脚本在src/下,报错No such file or directory -
env没设 → Python 脚本 import 第三方包失败,因为虚拟环境变量没传进去 -
preLaunchTask名字拼错 → 编译任务根本没执行,调试器试图运行一个不存在的二进制文件
正确生成 launch.json 的操作路径
打开「运行和调试」侧边栏(Ctrl+Shift+D),点击顶部 ⚙️ 图标,VS Code 会根据你已安装的扩展自动列出模板。关键点:
- 必须先确保对应语言扩展已启用:Python 要装
ms-python.python(不是只装 Pylance),C/C++ 要装ms-vscode.cpptools - 最好先打开一个
.py或.cpp文件,否则 VS Code 可能识别不出当前语言上下文,不显示对应选项 - 选中模板后生成的
launch.json带完整注释,字段语义清晰,且自动适配当前环境(比如自动填入${file}或${workspaceFolder})
常见语言的 program 字段怎么填
program 是最常出错的字段,它必须指向**真实可执行入口**,且路径解析依赖 cwd。不同语言差异明显:
- Python:
"program": "${file}"(单文件调试)或"module": "my_package.main"(模块方式,不能和program同时存在) - Node.js:
"program": "${workspaceFolder}/index.js",不能指向.ts,除非已配好 sourceMap 且outFiles指向编译后路径 - C/C++:
"program": "${workspaceFolder}/build/hello",必须是编译后的二进制(g++ -g hello.cpp -o build/hello),不能填.cpp源文件 - .NET:
"program": "${workspaceFolder}/MyApp/bin/Debug/net9.0/MyApp.dll",其中net9.0必须与你dotnet --list-sdks输出的实际 SDK 版本一致
断点变空心圆?先查这三件事
断点灰色、悬停显示 undefined、F5 后跳过不停 —— 这不是 VS Code 坏了,而是调试链路脱节。优先检查:
- TypeScript/JS:确认
sourceMaps: true,outFiles匹配.js.map实际路径,且.map文件里的sources字段指向你 workspace 内的.ts文件 - C/C++:90% 是编译没加
-g,检查tasks.json的args是否含"-g";用 CMake 的话,确认set(CMAKE_BUILD_TYPE Debug) - Python:右下角状态栏确认解释器路径是否为虚拟环境内(比如
/venv/bin/python),而不是系统全局 Python
复杂点在于:这些字段之间有隐式依赖。比如 program 路径错了,env 和 sourceMap 就全白配。所以每次改完配置,务必验证路径是否真实存在、权限是否可执行、环境是否激活——别让调试器替你猜。











