Part 1、安装调试用到的工具

一、安装调试器

以下两种调试器安装其中一个即可。

  1. gdb
     sudo apt install gdb -y
    

    如果你用的是MinGW,那么它自带了gdb调试工具。这种情况下,你需要确保MinGW的bin目录列在了Windows的Path变量中。

  2. LLDB
     sudo apt install lldb -y
    

二、安装插件

针对于不同的调试器,安装以下二者之一即可。

  1. C/C++ IntelliSense
    • 此插件支持的调试器是gdb,在WindowsLinux下均可用。
  2. CodeLLDB
    • 此插件支持的调试器是LLDBLinux下可用。

CodeLLDB安装出错的解决方案

在Windows(WSL)下安装CodeLLDB插件的过程大概率会出错,原因是插件无法下载。可以这样来解决问题:

  1. 手动下载插件

    将出错信息中的下载链接复制下来,可能是这样的: https://github.com/vadimcn/vscode-lldb/releases/download/v1.6.10/codelldb-x86_64-windows.vsix

    将链接粘贴到浏览器的地址栏中,然后回车,下载就开始了。下载完成后,将这个.vsix文件移动到一个容易访问的磁盘,例如D:盘根目录下。

  2. 安装插件

    Code中,点击左侧的插件按钮,然后点击靠近顶部的...,在下拉菜单中选择从VSIX安装/install from VSIX,在出现的输入框中输入存放插件的位置,例如/mnt/d,选择列出的插件就开始安装了。


Part 2、配置调试器

一、配置编译任务

在启动调试之前,可能需要编译链接源代码,因此需要配置编译任务。

  1. 点击主菜单栏中的终端(Terminal),选择配置任务(Configure Tasks…)

  2. 在出现的选择窗口中,选择C/C++: gcc build active file

  3. 此后,在项目目录下,将会生成一个.vscode子目录,任务配置tasks.json就存放在这个目录下。现在编辑生成的tasks.json,内容类似于如下:
     {
         "version": "2.0.0",
         "tasks": [
             {
                 "type": "cppbuild",
                 "label": "MinGW build",
                 "command": "gcc",
                 "args": [
                     "-g",
                     "-Wall",
                     "${file}",
                     "-o",
                     "${fileDirname}\\${fileBasenameNoExtension}.exe"
                 ],
                 "options": {
                     "cwd": "${fileDirname}"
                 },
                 "problemMatcher": [
                     "$gcc"
                 ],
                 "group": "build",
                 "detail": "compiler: gcc"
             },
             {
                 "type": "cppbuild",
                 "label": "gcc build",
                 "command": "gcc",
                 "args": [
                     "-g",
                     "-Wall",
                     "-fsanitize=address",
                     "${file}",
                     "-o",
                     "${fileDirname}/${fileBasenameNoExtension}"
                 ],
                 "options": {
                     "cwd": "${fileDirname}"
                 },
                 "problemMatcher": [
                     "$gcc"
                 ],
                 "group": "build",
                 "detail": "compiler: gcc"
             }
         ]
     }
    

    以上配置中,为MinGWLinux gcc下的任务分别进行了配置。

    这里说明一下配置中关键的键和值的含义:

    • label:指定了此配置的名称,我们在后面还要用到。
    • args:编译选项。
      • -g:启用调试模式
      • -Wall:开启所有警告
      • -o:指定可执行文件名。假设源文件是/mnt/d/tmp/myprog.c,则${fileDirname}就是/mnt/d/tmp${fileBasenameNoExtension}就是myprog。注意:在Windows下显式指定了可执行文件的扩展名(后缀名)为.exe
  4. 语言标准选项

    如果你需要使用最新的语言标准,并且你用的编译器支持,那么可以在args键值下的-o选项前,加上一下两项标准之一:

    C23

     "-std=c2x",
    

    C++ 23

     "-std=c++23",
    

一旦任务配置好,那么就可以在菜单终端->运行任务中,选择配置好的任务之一执行。

二、配置调试器

无论是gdb还是LLDB,它们在Code的配置几乎是一样的。

  1. 打开你的项目目录(文件夹)。

    根据需要,直接打开或者远程连接上项目目录。

    原则上,应该为每一个项目配置调试信息。

  2. 点击Code界面左侧的调试按钮。这个按钮长这样:

    如果是第一次,那么会出现类似于这样的字样:

     为运行和调试,创建一个 launch.json 文件
    

    其中,launch.json是一个链接。

  3. 点击这个链接,Code就会弹出一个选择框:

    在此选项中选择C++(GDB/LLDB)

    此后,Code会在你的当前项目目录下新建一个名为.vscode的子目录,并在其中新建一个名为launch.json的配置文件。同时这个文件会在Code右侧的编辑框中打开,其初始内容如下:

     {
         // 一些注释
         "version": "0.2.0",
         "configurations": []
     }
    
  4. 编辑launch.json文件,添加内容如下:

     {
         "version": "0.2.0",
         "configurations": [
             { //for gdb
                 "name": "GDB",
                 "type": "cppdbg", 
                 "request": "launch",
                 "program": "${fileDirname}/${fileBasenameNoExtension}",
                 "cwd": "${fileDirname}",
                 "MIMode": "gdb",
                 "args": [],
                 "stopAtEntry": false,
                 "environment": [],
                 "externalConsole": false,
                 "setupCommands": [
                     {
                         "text": "-enable-pretty-printing",
                         "ignoreFailures": true
                     }
                 ],
                 "preLaunchTask": "gcc build",
                 "miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; gdb -q --interpreter=mi"
             },
             { //for lldb
                 "name": "LLDB",
                 "type": "lldb",
                 "request": "launch",
                 "program": "${fileDirname}/${fileBasenameNoExtension}",
                 "cwd": "${fileDirname}",
                 "args": [],
                 "preLaunchTask": "gcc build",
             }
         ]
     }
    

    注意事项:

    • preLaunchTask键值指定了在调试前需要预先执行的任务。这个任务一般是在tasks.json中配置好的任务(名)之一。例如,这里GDB配置下给出的任务是gcc build
    • program键值下的可执行代码名必须与tasks.json-o选项后的配置一样。例如,如果选择了preLaunchTaskMinGW build,则可执行代码名后要加上.exe后缀。

Part 3、调试程序

这里给出示例的假设基础:

  • 编译器:gcc
  • 工作目录名:myproject
  • 源码:f.c
  1. 启动调试
    • 在源码中需要暂停的地方按F9设置(或取消)断点。鼠标也可以操作。
    • 点击左侧的调试按钮,将出现这样的窗口:

    顶部默认的调试配置是我们在launch.json中写好的GDB。可以根据需要,选择配置好的其他选项,例如LLDB

    • 点击GDB旁的绿色三角,调试开始。

    直接按F5可以启用默认选项进行调试。

  2. 这是调试启动后的窗口示例。

    可以看到,程序执行暂停在了断点上。

    点击调试跟踪运行按钮中的一个,可以使程序单步、跟踪等操作。

    注意,调试完成后请别忘了按那个橙粉色的方框按钮,以停止调试。

    更多调试方法和技巧请自行查阅相关资料,这里不再赘述。

  3. 调试时出现乱码

    如果在Windows环境下使用MinGW,那么在运行或调试时可能出现中文输出乱码的情况。在这种情况下,最佳的解决方案是,将源文件的编码从utf-8改成gbk。具体方法是:在VS Code的右下角状态栏中,点击UTF-8,选择保存为编码格式,选择简体中文(gbk)