在launch.json中通过args字符串数组传参,每个参数独立成项,含空格路径直接写为单个元素,不拼接、不手动加引号,如["--port", "3000", "--input", "data/file.txt"]。

launch.json 里怎么传命令行参数给程序
VSCode 的 launch.json 本身不支持直接写 ./main --verbose -i input.txt 这样的完整命令,必须拆解为程序路径 + 参数数组。关键字段是 args,它必须是字符串数组,每个参数单独一项。
常见错误是把多个参数拼成一个字符串,比如写成 "args": ["--verbose -i input.txt"] —— 这会让程序收到一个参数,而不是两个。
-
args中每个元素对应终端里一个独立的参数(空格分隔后的结果) - 含空格的值(如文件路径)需用双引号包裹,但写在数组里时,双引号是 JSON 字符串边界,不是参数内容:正确的写法是
"args": ["-f", "my config.json"],VSCode 会自动把"my config.json"当作一个参数传给进程 - 如果程序本身需要解析
--后的标志位,确保这些标志拼写和大小写完全匹配目标程序的预期
不同语言调试器对 args 的处理差异
不是所有调试器都原生支持 args。C/C++(通过 cppdbg)、Go(go)、Python(python)等主流调试器都支持;但像某些自定义 launch 类型(如用 node 调试非 Node.js 程序)可能忽略该字段。
检查当前配置是否生效:在 launch.json 中加个临时断点或打印语句,运行后看实际接收到的 argv 是否符合预期。
- Python:用
sys.argv查看;注意sys.argv[0]是脚本路径,第一个用户参数是sys.argv[1] - C/C++:在
main(int argc, char *argv[])中打印argc和各argv[i] - Node.js:
process.argv第一个是node可执行路径,第二个是脚本路径,之后才是你的args
args 与 env、cwd 配合才能跑通相对路径
如果参数里有 -f config.yaml 这类相对路径,实际行为取决于 cwd(工作目录),不是 launch.json 所在目录,也不是源码目录。
不设 cwd 时,VSCode 默认以打开的文件夹根目录为工作目录;但如果你在子目录中右键“Debug”,而 cwd 没显式指定,就可能报 “file not found”。
- 显式设置
"cwd": "${workspaceFolder}/src",让所有相对路径以此为基准 -
env可用于传环境变量,比如"env": {"RUST_LOG": "debug"},它和args是并列字段,不能混用 - 避免在
args里硬编码绝对路径(如/home/user/project/data.txt),这会降低配置可移植性
调试带空格或特殊字符的参数时怎么转义
JSON 标准不支持反斜杠转义空格,也不需要——只要整个参数用双引号包住,VSCode 就会原样传递。例如:
"args": ["--name", "John Doe", "--path", "/tmp/my file.txt"]
上面会传四个参数:--name、John Doe、--path、/tmp/my file.txt。注意:不需要写成 "John Doe" 或 "John\ Doe",那反而会导致参数里多出反斜杠。
真正要小心的是 shell 特殊字符,比如 $、`、( )。VSCode 不经过 shell 解析,所以 "args": ["--query", "$USER"] 传给程序的就是字面量 $USER,不会展开。需要展开的话,得在程序内部处理,或改用 terminal 方式运行。
最易被忽略的一点:修改 launch.json 后必须重新点击「开始调试」,热重载不生效;而且如果之前调试会话没完全退出(进程残留),新参数可能被旧进程忽略。关掉所有终端和调试控制台再试,更可靠。


















