VSCode 调试 WSL C/C++ 项目

由于本文涉及的软件较多,因此不会细讲部分基础操作,所以需要你具备以下软件的使用经历:

  • VSCode 编辑器
  • Windows Subsystem For Linux(WSL)
  • Ubuntu
  • C 或 C++
  • Make
  • CMake

在阅读这篇文章之前,希望你已经看过我之前写的两篇文章

本文主要是在这两篇文章的基础上,通过安装 VSCode 插件 Remote - WSL 以及修改 json 配置来实现在 WSL Ubuntu 中调试 C/C++ 程序。

开发环境

我本地的开发环境大致如下:

  • Windows 10
  • Visual Studio Code(VSCode)
  • Windows Terminal
  • WSL(Ubuntu 20.04.3 LTS)
  • Ubuntu(gcc make cmake)

VSCode 安装 WSL 插件

在 VSCode 的插件市场搜索 Remote - WSL 插件,点击 安装

VSCode 调试 WSL C/C++ 项目

通过 Windows Terminal 终端进入到 WSL Ubuntu 系统,在用户目录下创建一个项目文件夹 mkdir helloWord,进入文件夹 cd helloWorld,执行 code . 这个命令,这个命令是让 VSCode 打开当前目录。

VSCode 调试 WSL C/C++ 项目

如上图,如果 Ubuntu 系统之前没有安装过 VSCode Server,那么 VSCode 就会自动下载并将其安装到你的 Ubuntu 系统中。VSCode 编辑器会与这个 VSCode Server 通信来实现在 Windows 中修改和调试 Ubuntu 中的代码。

等 VSCode Server 安装完成后,再通过 code . 在 Ubuntu 中打开文件夹,就会在 VSCode 编辑器的左下角看到 WSL: Ubuntu 的标识,这说明我们的编辑器已经和 WSL Ubuntu 连接上了。

VSCode 调试 WSL C/C++ 项目

编写示例代码

在 VSCode 中依次创建 main.c src/sum.h src/sum.c 等文件,文件目录结构如下:

~/helloWorld/
  ├─ src/
  │  ├─ sum.h
  │  └─ sum.c
  └─ main.c

main.c 文件:

#include <stdio.h>
#include "src/sum.h"

int main() {
    int a = 1, b = 2;
    int c = sum(a, b);
    printf("%d + %d = %d\n", a, b, c);
    return 0;
}

src/sum.h 文件:

int sum(int a, int b);

src/sum.c 文件:

int sum(int a, int b) {
    return a + b;
}

Make 调试配置

我们先来看一下如何配置 Make 的调试,首先需要先在项目的根目录下创建 Makefile 文件,文件内容如下:

# 编译 main 可执行程序
main: main.o sum.o
    $(CC) $(CFLAGS) main.o sum.o -o main

main.o: main.c
    $(CC) $(CFLAGS) -c main.c -o main.o

sum.o: src/sum.h src/sum.c
    $(CC) $(CFLAGS) -c ./src/sum.c -o sum.o

# 伪目标, 删除所有目标文件
clean:
    rm *.o main

$() 是 Make 中读取变量的方式。

在 Make 中有一套内部变量可以在 make 命令中赋值,然后在 Makefile 中使用,如变量:ARCCCXXCFLAGSCXXFLAGS 等,具体可以参阅 GNU 官方文档:10.3 Variables Used by Implicit Rules

  • CC 变量是 C 代码的编译器,默认值是 cc
  • CXX 变量是 C++ 代码的编译器,默认值是 g++
  • CFLAGS 变量可传递编译参数给 C 编译器;
  • CXXFLAGS 变量可传递编译参数给 C++ 编译器;

接下来给 VSCode 设置编译和调试的各项配置。

.vscode/c_cpp_properties.json 文件

{
    "version": 4,
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ]
}

.vscode/tasks.json 文件

{
    // 更多任务设置参考:https://go.microsoft.com/fwlink/?LinkId=733558
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build For Debug",
            "type": "cppbuild",
            "command": "make",
            "args": [
                "CFLAGS=-g", // -g 参数会将调试信息编译到可执行程序中
                "CXXFLAGS=-g"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": false
            },
        }
    ]
}

.vscode/launch.json 文件

{
    // 更多调试设置参考:https://code.visualstudio.com/docs/cpp/launch-json-reference
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/main",
            "args": [],
            "cwd": "${workspaceFolder}",
            "stopAtEntry": false,
            "externalConsole": false,
            "preLaunchTask": "Build For Debug",
            "linux": {
                "MIMode": "gdb",
                "miDebuggerPath": "/usr/bin/gdb"
            },
            "osx": {
                "MIMode": "lldb"
            },
            "windows": {
                "MIMode": "gdb",
                "miDebuggerPath": "C:\\Softwares\\MinGW64\\bin\\gdb.exe"
            }
        }
    ]
}

配置好这些 json 文件后,在 main.c 中添加断点,然后点击菜单栏的 启动调试 F5 选项,程序运行并停在你打断点的地方。

VSCode 调试 WSL C/C++ 项目

CMake 调试配置

接下来我们把项目编译工具由 Make 改为使用 CMake。

首先把之前的 Makefile 文件删除,然后在项目根目录创建一个 CMakeLists.txt 文件,文件内容如下:

# CMake最低版本号要求
cmake_minimum_required(VERSION 3.0)

# 配置项目名
project(helloWorld)

# 递归遍历获取项目的所有源文件列表
file(GLOB_RECURSE SRC_LIST FOLLOW_SYMLINKS main.c src/*.c)

# 生成可执行文件 main,后面是源码列表
add_executable(main ${SRC_LIST})

接者去修改 VSCode 的编译和调试配置。

.vscode/tasks.json 文件

{
    // 更多任务设置参考:https://go.microsoft.com/fwlink/?LinkId=733558
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Generate Debug",
            "type": "cppbuild",
            "command": "cmake",
            "args": [
                "-B",
                "debug",
                "-D",
                "CMAKE_BUILD_TYPE=Debug",
                "-G",
                "\"MinGW Makefiles\""
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": false
            },
        },
        {
            "label": "Build For Debug",
            "type": "cppbuild",
            "command": "cmake",
            "args": [
                "--build",
                "debug"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "dependsOn": [
                "Generate Debug"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
        }
    ]
}

.vscode/launch.json 文件

{
    // 更多调试设置参考:https://code.visualstudio.com/docs/cpp/launch-json-reference
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Project debug (C/C++ GDB)",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/debug/main",
            "args": [],
            "cwd": "${workspaceFolder}",
            "stopAtEntry": false,
            "externalConsole": false,
            "preLaunchTask": "Build For Debug",
            "linux": {
                "MIMode": "gdb",
                "miDebuggerPath": "/usr/bin/gdb"
            },
            "osx": {
                "MIMode": "lldb"
            },
            "windows": {
                "MIMode": "gdb",
                "miDebuggerPath": "C:\\Softwares\\MinGW64\\bin\\gdb.exe"
            }
        }
    ]
}

配置好这些 json 文件之后,点击菜单栏的 启动调试 F5 选项,程序运行并停在你之前打断点的地方。

VSCode 调试 WSL C/C++ 项目

本作品采用《CC 协议》,转载必须注明作者和本文链接
xiaer
讨论数量: 2

:+1:厉害,感谢。最近在这方面的资料。

感慨一下:当我水平一般的时候,找的资料是入门的。但当我水平有所提升之后找的文档也水涨船高。

当然搜索软件更厉害

1年前 评论
xiaer (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!