我有一个遍历文件层次结构的程序,程序根据传入的文件路径,对该路径下的所有文件进行遍历。这个程序生成一个名为 ftw
的可执行文件,如果我要遍历 /bin
目录,用法为:
ftw /bin
问题是,如果我想单步跟踪,看看程序是如何遍历文件层次结构的,那么在启动调试器时,需要知道传给 ftw 程序的路径是什么,而且需要调试器自动传给 ftw 。
我查找了资料,资料告诉我:
在使用VSCode和CMake编写C程序并进行调试时,你可以通过设置 launch.json
文件来传递参数。以下是实现的步骤:
-
配置调试启动文件
launch.json
: 打开VSCode,切换到调试视图,点击配置(齿轮图标)或者选择 “创建一个启动配置文件”,然后选择 “C++(GDB/LLDB)”。 -
修改
launch.json
文件: 找到"configurations"
部分,并创建一个新的配置,类似于下面的示例:
{
"version": "0.2",
"configurations": [
{
"name": "CMake Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/your_executable", // 修改成你的可执行文件路径
"args": ["arg1", "arg2", "arg3"], // 在这里传入参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "cmake-build-debug"
}
]
}
确保将 "program"
字段设置为构建后的可执行文件路径。在 "args"
字段中,将需要传入的参数作为一个数组填入。
-
保存
launch.json
文件,并返回到调试视图。 -
开始调试: 点击调试按钮开始调试,VSCode 将会使用你在
launch.json
文件中配置的参数来运行你的程序。
通过这样的方式,你就可以在进入调试之前传入参数了。
但是这种方式对我的代码不起作用,我所使用的是 CMake Debug,如下图所示。(也可以使用快捷键 Ctrl + F5
)
通过测试,发现以下步骤可以正确传入参数:
在 Linux 环境下使用 VSCode 和 CMake 编写 C 程序,并且需要在进入调试之前传递参数,你可以按照以下步骤操作:
- 在
.vscode
目录下,创建一个名为settings.json
的文件。 - 编辑
settings.json
文件,将待传递的参数写入cmake.debugConfig
部分。例如,如果你想传递参数first_arg
、second-arg
和third arg
,可以按照以下格式添加:
{
"cmake.debugConfig": {
"args": [
"first_arg",
"second-arg",
"third arg"
]
}
}
- 点击 VSCode 底部状态栏中的 Debug 按钮或者 Launch 按钮运行你的程序。
这样,你的 C 程序将会接收到传递的参数。在你的 main.c
文件中,你可以使用 argc
和 argv
来获取这些参数。例如:
#include <stdio.h>
int main(int argc, char **argv) {
printf("总参数个数为:%d\n", argc);
for (int i = 0; i < argc; i++) {
printf("第%d个参数为:%s\n", i + 1, argv[i]);
}
return 0;
}
这样,你就可以在进入调试之前成功传递参数给你的 C 程序了。
例子输出为:
总参数个数为:4
第1个参数为:/home/Helloworld/build/Helloworld
第2个参数为:first_arg
第3个参数为:second-arg
第4个参数为:three arg
那么,为什么在 launch.json 中设置 “args” 不起作用?
这是以为 launch.json 不是由 CMake 工具调试或运行功能使用的,而是由 F5 使用的。