起因
本意是想在VSCode上配置Debug,实现对已有项目工程make run命令运行后的C语言文件的单步调试,但无果。
因此只能是退而求其次,配置一个测试环境。但因为网上大多数教程并未详细所使用的launch.json及tasks.json配置文件的内含,我找了很多的教程都没有实现成功,因此以此篇blog记录最终的正确功能实现。
配置步骤
- 先在需要测试环境的目录下新建一个vscode配置文件夹,名为".vscode",并在其中新建两个json配置文件,分别名为"launch.json"及"tasks.json"。
- 将launch.json和tasks.json分别配置如附录中源代码所示。
- 在需要运行的C语言程序中打断点后,即可开始单步调试。
一些思考
关于launch.json与tasks.json的关系
vscode进行调试前,即当你在【运行与调试】中点了绿色的三角标后▶️,应该会运行并解析launch.json,而launch.json中有两个配置是需要注意的–“program"和"preLaunchTask”。
因为调试本身其实也是借用gdb进行的debug,因此本质上也是代码实现的,我们所进行的图形化操作最终都转化为了cmd命令形式。
而"program"指的是最后我们gdb调试的文件(一般是通过gcc xxx.c -o xxx)生成的那个可执行文件,因此如果最后想调试生成的文件命名为xxx.out,可以将此项修改为"${fileDirname}/${fileBasenameNoExtension}.out",这都是没关系的。
而"preLaunchTask"指的是在launch执行前所做的工作,也就是我们在tasks.json中配置的内容,因此此处的内容要与tasks.json内的"label"相对应,否则将会报错。
tasks.json中需要注意"args"项,此处即指的是tasks.json的"cmd"项内容的参数,因此如果需要做些额外的操作,直接通过修改"command"项及"args"项即可,甚至可以在这个地方实现一些攻击(滑稽🤪,就和跨站脚本攻击一样哈哈哈)。
我是因为正在学习"readline"库,而该库的编译需要动态链接,也正是因此我在"args"末尾加上了"-lreadline"参数,否则会报错。
关于未来
我总觉得应该是能够实现通过配置文件,然后针对一个工程(工程包含了很多很多.c程序,平常是使用make统一编译的)里单步调试,但是调研后发现cmake tools好像也不是以此为目标的,希望未来可以找到问题的解决方法吧!
附录源代码
launch.json内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "compile",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
tasks.json内容如下:
{
"version": "2.0.0",
"tasks": [{
"label": "compile",
"command": "gcc",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lreadline",
],
"problemMatcher": {
"owner": "cpp",
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
},
"group": {
"kind": "build",
"isDefault": true
}
}
]
}