Vscode 调试相关配置记录

最近觉得,在 vscode 里还用命令行 gdb 各种调试其实不太优雅。

毕竟 vscode 自带的调试相当于是给 gdb 来了一个扩展,用起来更舒服一些。

于是找 wqs 神仙学习了一下这玩意儿的工作原理,然后改了改配置文件。


Vscode 的调试依赖于两个文件:launch.jsontask.json

launch.json 的作用主要就是启动调试器(一般都是 gdb),而 task.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": "Debug a C++ program with GDB",  // 该调试任务的名字,启动调试时会在待选列表中显示
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,  // 这一项控制是否在入口处暂停,默认false不暂停,改为true暂停
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,  // 这一项控制是否启动外部控制台(独立的黑框)运行程序,默认false表示在集成终端中运行
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",  // 调试器路径,必须与你自己的电脑相符
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "Compile a C++ program with GNU C++17 (msys2 64bit)"  // 调试前的预执行任务,这里的值是tasks.json文件中对应的编译任务,也就是调试前需要先编译
        }
    ]
}

其实也没啥好说的,就看看注释就行,这个是从某个博客复制过来改的,有时间找一下出处。

然后就是,因为开了 O2 调试经常会突然调到令人难以理解的地方,所以还是不开 O2 比较好。

然后再看 task.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
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
{
    "tasks": [
        {
            "type": "shell",
            "label": "Compile a C++ program with GNU C++17, O2 (msys2 64bit)",
            "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-std=c++17",
                "-O2",
                "-Wall",
                "-Wextra",
                "-Wshadow",
                "-g"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Compile a C++ program with O2."
        },
        {
            "type": "shell",
            "label": "Compile a C++ program with GNU C++17 (msys2 64bit)",
            "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-std=c++17",
                "-Wall",
                "-Wextra",
                "-Wshadow",
                "-g"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": false
            },
            "detail": "Compile a C++ program without O2."
        },
        {
            "label": "Run a C++ program with GNU C++17, O2 (msys2 64bit)",
            "type": "shell",
            "command": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "options": {
                "cwd": "${fileDirname}"
            },
            "dependsOn": "Compile a C++ file with GNU C++17, O2 (msys2 64bit)",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            },
            "detail": "Run a C++ program with O2."
        },
        {
            "label": "Run a C++ program with GNU C++17 (msys2 64bit)",
            "type": "shell",
            "command": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "options": {
                "cwd": "${fileDirname}"
            },
            "dependsOn": "Compile a C++ program with GNU C++17 (msys2 64bit)",
            "group": {
                "kind": "build",
                "isDefault": false
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            },
            "detail": "Run a C++ program without O2."
        }
    ],
    "version": "2.0.0"
}

这里有两种 task,一个是编译源文件,另一个是运行源文件。

后一个 task 依赖于前一个,所以会有 dependsOn 这样的内容。

type 一般来说选 shell 会比较好,因为这样可以让 task 直接在终端里运行,比较符合日常习惯。

presentation 则是运行完之后的一些信息显示之类的,比如 echo 就表示是否显示信息,clear 表示是否情况之前的输出。

panel 则是是否与上一个任务共用终端。

然后记得要在分组里选上 build,不然 C-S-b 的时候不会出现对应 task 的(

然后这样配置好之后把文件放到对应工作区的 .vscode 目录下,直

接 F5 就能调试了。

调试的时候就在终端里输入,手动使用 gdb 原生命令需要在 Debug console 里,还需要加上 -exec 前缀。

因为 Debug console 其实本质上是给表达式求值用的。

1.png

运行的话直接选中对应任务就可以了。

不过这里唯一难受的点是,我修改默认终端为 Git Bash 之后,json 设置里的缺省路径会有 d: 的字样,bash 没法识别。

我还在思考怎么修改让它来适配。


最后更新: May 9, 2023