vscode配置C++非常麻烦, 我之前配置了好几次都失败了, 更别说配置debug.
今天又尝试了以下, 惊奇的配置成功了. 就几个简单的步骤, 以前怎么就配置不成功呢…
值得一提的是, 以前总是会出现没有找到标准库path然后在include那里画波浪线的情况, 这次居然都好了, 估计是版本更新让它更好用了吧.
分为两种情况, 一种是调试单个文件的. 另一种是调试用make生成的多文件调试. 下面分别介绍.
单文件调试
首先创建一个文件夹, 再创建一个test.cpp文件
写入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
using namespace std;
int main(int args, char **argv) {
int a;
a = 3;
int b;
cin >> b;
cout << "b = " << b << endl;
cout << "args: " << args << endl;
for (int i = 0; i < args; i++) {
cout << argv[i] << endl;
}
return 0;
}
|
然后点到调试, 点击create a launch.json file
选择 g++, 他就会自动生成一个launch.json. 然后就可以直接设置断点调试啦!
奇怪我以前也这样试过但没有成功过…
这样还无法输入数据(cin), 我的解决方法是将launch.json中的这个字段设置为true
1
|
"externalConsole": true,
|
这样它会弹出一个窗口, 我们就可以输入数据了.
类似的, 有时候我们执行的命令行程序需要有命令行参数, 怎么办呢?
还是修改launch.json中的字段
1
|
"args": ["arg1", "arg2", "arg3"],
|
下面是我生成的launch.json文件和tasks.json文件.
launch.json文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "test",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": ["arg1", "arg2", "arg3"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "test"
}
]
}
|
值得注意的是, 这里的name
字段指的是这个配置的名字, 而最下面的preLaunchTask
字段才是和tasks里的label
配置一一对应的. 这个非常重要.
同样的, 在一个launch.json里, 可以添加多个配置, 在debug界面会以下拉菜单选择使用. 这样就可以在一个文件夹里为每个单个的cpp文件添加调试配置啦.
tasks.json文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
"tasks": [
{
"type": "shell",
"label": "test",
"command": "C:\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "C:\\mingw64\\bin"
}
}
],
"version": "2.0.0"
}
|
这个command命令非常重要, 它是生成exe文件的关键, 也是可以修改的. 我们后面介绍的makefile编译调试就是主要要修改这个command.
值得注意的是, 下面这个cwd
字段坑了我一段时间.
1
2
3
|
"options": {
"cwd": "C:\\mingw64\\bin"
}
|
我执行makefile的debug的时候, 有这个字段, 于是make它总说找不到文件, 我添加绝对路径之后就好了. 我删掉它就好了(当然这里不要删).
我猜cwd是change work directory
的缩写, 执行make的时候, 到这个工作目录下, 当然找不到文件了.
make调试
支持make调试的不同就是tasks.json
的不同, 它控制了exe文件的生成.
因此我们需要将command修改
新的tasks.json如下
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"tasks": [
{
"type": "shell",
"label": "echo",
"command": "make",
// "options": {
// "cwd": "C:\\mingw64\\bin"
// }
}
],
"version": "2.0.0"
}
|
注意注释掉的那几行, 取消注释就错了. 这里我给出是为了提醒. 因为如果修改一个空模板, 不会有它, 而修改g++模板, 会有它. 这个需要注意.
当然, 想要调试, make中必须开启-g
选项.
例子
下面提供一个make调试的例子.
下面是目录树.
1
2
3
4
5
6
7
|
├── Makefile
├── add.cpp
├── sub.cpp
├── test.h
└── .vscode
├── launch.json
└── tasks.json
|
Makefile
1
2
|
add.exe:
g++ add.cpp sub.cpp -g -o add.exe
|
add.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
using namespace std;
#include "test.h"
int add(int a, int b) {
return a + b;
}
int main() {
int a = 1;
printf(" 2 + 3 = %d\n", add(2, 3));
scanf("%d", &a);
printf(" 2 - 3 = %d\n", sub(2, 3));
return 1;
}
|
sub.cpp
1
2
3
4
5
|
#include "test.h"
int sub(int a, int b) {
return a - b;
}
|
test.h
1
2
3
4
5
6
|
#ifndef _TEST_H
#define _TEST_H
int add(int a, int b);
int sub(int a, int b);
#endif
|
launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "debug-c++",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "echo"
}
]
}
|
tasks.json
1
2
3
4
5
6
7
8
9
10
11
12
|
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "make"
}
]
}
|