示例

1

这是我在本文中用作示例的文件夹的图片,然后我先介绍下需要用到的,这样大家才能更好的理解后面的launch.json和tasks.json的配置

本文使用的是c++语言,用的编译器是mingw,命令行编译使用的就是g++

  • 红色:
    红色方框的是主要的文件夹

    • .vscode:这个文件夹也是自带的,如果没有的话,麻烦大家自行查阅吧,本文重点不是这个。然后这个文件夹就是存放的一些配置文件,一般是json格式的

    • build: 这个是使用cmake创建的文件夹,本文主要是两类配置,一种是不适用cmake的,一种是使用cmake的

  • 蓝色:
    蓝色方框的就是我们的重点了,这个会在后面涉及

  • 绿色
    绿色方框的是cmake需要用到的文件,不用cmake的不用理会

  • 黄色:
    黄色方框的就是我们的源文件、头文件和可执行程序了

    主要内容就是交换两个数

  • 紫色:
    紫色方框的就是我们的可执行文件了,我们将它命名为out.exe

了解完我们的示例结构后,开始进入下面的环节吧

什么是debug(调试)

简单来说就是我们能够用较小的粒度(比如说一句,一个变量)去分析代码,从而找出问题,也就是bug

粒度的控制就取决于断点、监控变量(vscode自带)等等

我们还需要注意一个点,我们只能对 带有调试信息的可执行文件debug,这个就要用到命令行编译的知识了,放心,很简单的,就像是个模板套公式就行

大家用命令行的时候要记得用tab去补全,我下面就不用规范的写了,大家知道文件放哪个位置,然后tab补全就行了

  • 不带调试信息的编译
    g++ -o out main.cpp swap.cpp,大家把源文件换成自己的,然后可执行文件的名字可以随意,我这里就命名为out了,windows下会自己加后缀名,也就是最终会变成 out.exe

    然后这样子生成的就是不带调试信息的可执行程序了,是不能debug的,但是可以运行

  • 带调试信息的编译
    g++ -g main.cpp swap.cpp -o out,这里加上-g选项就是表示带调试信息了,大家一样替换就行

什么是launch.json和tasks.json

这两个就是debug使用的配置文件了,然后我们简单讲讲他们的作用和联系吧

tasks.json的作用就是生成带有调试信息的可执行程序

launch.json的作用就是调试tasks.json生成的可执行程序

所以tasks.json是要先于launch.json执行的

配置

这里提供了两种类型的简单配置,大家自行选择

不使用cmake版

  • tasks.json

先回忆下命令行的编译g++ -g main.cpp swap.cpp -o out

{
    "version": "2.0.0", // 任务配置的版本,一般不需要管
    "tasks": [ // 里面存放的就是任务,也就是生成待调试信息的可执行程序的步骤
        {
            "type": "shell", // 任务类型为shell,也就是命令行的方式
            "label": "C/C++: gcc.exe 生成活动文件", // 任务的名称,随便写
            "command": "D:/MinGW64/bin/g++.exe", // 命令行编译使用的命令,这里使用的是g++,大家根据自己的情况填写
            "args": [
                "-g", // 编译选项,表示携带调试信息
                "main.cpp", // 源文件
                "swap.cpp", // 源文件
                "-o", // 输出
                "${workspaceFolder}/out.exe" // 生成的可执行文件,大家一定要明白这个任务生成的位置是在哪里,要和launch.json对应,不然很容易出错
            ],
            "options": {
                "cwd": "${workspaceFolder}" // 指定当前任务执行时的工作目录,然后其他地方需要路径的时候,我们可以填相对路径
            },
            "problemMatcher": [ // 这个输出编译时的错误和警告信息,大家按自己的编程语言选择,我用的是c++,所以这里是gcc
                "$gcc"
            ],
            "group": "build", // 可选,将该任务分配到build组,感觉大项目比较有用
            "detail": "编译器: D:/MinGW64/bin/gcc.exe" // 可选,这里是提示任务所使用的编译器的路径
        }
    ]
}

  • launch.json
{
    "version": "0.2.0", // 调试配置的版本号,一般不用管
    "configurations": [
        {
            "name": "Debug swap_test.exe", // 此次调试的名称,随便
            "type": "cppdbg", // 定义调试器的类型,这里表示使用c++调试器
            "request": "launch", // 启动一个新的调试会话
            "program": "${workspaceFolder}/out.exe", // 待调试的可执行程序的路径
            "args": [], // 这里设置可执行程序所需要的参数用于调试,比如你的程序需要一个文件名作为参数之类的
            "stopAtEntry": false, // 程序不会再入口点处停止(即main函数),从头运行到结束或设置的断点处
            "cwd": "${workspaceFolder}", // 设置当前的工作目录,其他需要填写路径的地方可以用相对路径
            "environment": [], // 设置调试的环境变量
            "externalConsole": false, // 不使用外部控制台,调试输出将显示在内置的调试控制台中
            "MIMode": "gdb", // 指定使用 gdb 调试器
            "miDebuggerPath": "D:/MinGW64/bin/gdb.exe", // gdb 调试器的路径
            "preLaunchTask": "C/C++: gcc.exe 生成活动文件" // 启动tasks.json创建的任务,名称一定要一样,要对应
        } 
    ]
}

非常重要的点时,launch.json中的program一定要写对,根据tasks.json中生成的可执行程序的位置填写,launch.json中的preLaunchTask一定要和tasks.json中的label相对应(一样)

使用cmake版

如果使用cmake的话,命令行的执行步骤如下

// 假设你已经编写了CMakeLists.txt文件了
mkdri build // 创建build文件夹
cd build // 进入build文件夹,cmake生成的文件放在这里
cmake .. // 去上一级目录找到CMakeLists.txt,不一定是上一级,反正找到该文件所在的目录就行
make // 开始执行, 我在windows下是要用 mingw32-make.exe, 两个意思是一样的,大家按自己的实际情况来

这里我就不一一注释了,和前一个版本的很像,大家对照着看

  • tasks.json
{
    "version": "2.0.0",
    "options": {
        "cwd": "${workspaceFolder}/build" //指定工作目录,相当于 cd build(前提是已经创建了build文件夹)
    },
    "tasks": [ // 以下有3个任务
        {
            "type": "shell",
            "label": "cmake",
            "command": "cmake", // 该任务相当于执行 cmake ..
            "args": [
                ".."
            ]
        },
        {
            "label": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command": "mingw32-make.exe", // 该任务相当于执行 make
            "args": []
        },
        {
            "label": "Build", // 这个任务的目的就是将前两个任务合起来
            "dependsOn": [ // 这里表示该任务的执行的依赖,也就是说Build依赖于上面两个任务
                           // 也就是说上面两个要先执行,才能执行Build
                "cmake",
                "make"
            ]
        }
    ]
}

  • launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/out.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:/MinGW64/bin/gdb.exe",
            "preLaunchTask": "Build" // 注意这里和tasks.json中的对应即可
        } 
    ]
}

总结

  • 第一点是首先大家所使用的软件要安装好,比如环境变量要配好,这样在配置文件中的路径才能有保障
  • 第二点是大家在调试之前,先确保命令行的执行都没有错
  • 第三点是launch.json和tasks.json一定要对应,主要就是launch.json中的 program和preLaunchTask 与 tasks.json中的 label
  • 第四点就是要明白最后生成的带有调试信息的可执行程序的位置在哪里,这主要就是配置文件中 cwd的设置,还有 ${workspaceFolder}${fileDirname} 的使用
    • ${workspaceFolder} 这个就是你用vscode打开的文件夹
    • ${fileDirname} 这个就是当前编辑文件的父目录
 posted on 2024-09-07 00:48  Dylaris  阅读(7379)  评论(0)    收藏  举报