提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
VSCode是一款微软出的轻量级编辑器。
本文主要介绍通过makefile和cmake组织的c语言工程如何debug。
main.c
#include
#include "func.h"
int main() {
printf("helloworld\n");
test();
return 0;
}
func.h
#include
void test();
func.c
#include "func.h"
void test() {
for (int i = 0; i < 10; i++) {
printf("%d\n", i);
}
}
Makefile
# -g -Wall是必须的
main:main.c test.c
gcc -o main main.c test.c -g -Wall
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "linux-gcc-x64",
"compilerPath": "/usr/bin/gcc",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - Build and debug active file",
"type": "cppdbg",
"request": "launch",
# 修改program为具体的可执行文件
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
# 修改preLaunchTask为tasks中的label名
"preLaunchTask": "build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
{
"tasks": [
{
"type": "shell",
# 修改label
"label": "build",
# 修改command
"command": "make",
# 注释掉args
// "args": [
// "-fdiagnostics-color=always",
// "-g",
// "${file}",
// "-o",
// "${fileDirname}/${fileBasenameNoExtension}"
// ],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
提供最新的launch.json和tasks.json,这样以后就可以直接复制而不必每次都像上面的生成原始文件再修改,同时提供的还有settings.json文件用于配置clangd
{
"version": "0.2.0", // 使用的 launch.json 版本
"configurations": [ // 配置调试器的配置列表
{
"name": "C++ Debug with lldb", // 调试器配置的名称,可以自定义
"type": "cppdbg", // 调试器类型为 C++ 调试
"request": "launch", // 请求启动调试会话
"program": "${workspaceFolder}/main", // 可执行文件的路径,主要的修改点
// 程序启动时的参数
"args": [],
"stopAtEntry": false, // 是否在程序入口处停止
"cwd": "${workspaceFolder}", // 工作目录
"environment": [], // 环境变量设置
"externalConsole": false, // 是否使用外部控制台
// 使用 lldb 调试器,如果使用gdb调试,换成gdb
"MIMode": "lldb",
// 配置 lldb 的初始化命令,启用漂亮打印
"setupCommands": [
{
"description": "Enable pretty-printing for lldb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// 在启动调试会话之前运行的任务(在 tasks.json 中配置)
"preLaunchTask": "Build",
// lldb-mi 调试器的路径,如果使用gdb调试,换成gdb的路径
"miDebuggerPath": "/usr/lib/llvm-6.0/bin/lldb-mi"
}
]
}
{
"version": "2.0.0", // 使用的 tasks.json 版本
"tasks": [ // 配置任务列表
{
"label": "Build", // 任务的标签,用于在 Visual Studio Code 中显示
"type": "shell", // 任务类型为 shell 命令
"command": "make", // 要执行的命令
"group": { // 任务分组信息
"kind": "build", // 将任务分组为构建类型
"isDefault": true // 设置为默认任务
}
}
]
}
cmake工程的launch.json和makefile工程基本类似,主要就是修改可执行文件路径
{
"version": "0.2.0", // 使用的 launch.json 版本
"configurations": [ // 配置调试器的配置列表
{
"name": "C++ Debug with lldb", // 调试器配置的名称,可以自定义
"type": "cppdbg", // 调试器类型为 C++ 调试
"request": "launch", // 请求启动调试会话
"program": "${workspaceFolder}/build/main", // 可执行文件的路径,主要的修改点
// 程序启动时的参数
"args": [],
"stopAtEntry": false, // 是否在程序入口处停止
"cwd": "${workspaceFolder}", // 工作目录
"environment": [], // 环境变量设置
"externalConsole": false, // 是否使用外部控制台
// 使用 lldb 调试器,如果使用gdb调试,换成gdb
"MIMode": "lldb",
// 配置 lldb 的初始化命令,启用漂亮打印
"setupCommands": [
{
"description": "Enable pretty-printing for lldb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// 在启动调试会话之前运行的任务(在 tasks.json 中配置)
"preLaunchTask": "CMake Build",
// lldb-mi 调试器的路径,如果使用gdb调试,换成gdb的路径
"miDebuggerPath": "/usr/lib/llvm-6.0/bin/lldb-mi"
}
]
}
cmake工程的tasks.json和makefile工程的主要区别就是任务有两步,分别是相当于cmake ..
和make
。调试的时候launch.json中的preLaunchTask要为第二个任务的lable
{
"version": "2.0.0", // 使用的 tasks.json 版本
"tasks": [ // 配置任务列表
{
"label": "CMake Configure", // 任务的标签,用于在 Visual Studio Code 中显示
"type": "shell", // 任务类型为 shell 命令
"command": "cmake", // 要执行的命令
"args": ["${workspaceFolder}"], // 命令的参数,这里是配置 CMake
"group": { // 任务分组信息
"kind": "build", // 将任务分组为构建类型
"isDefault": true // 设置为默认任务
}
},
{
"label": "CMake Build", // 任务的标签
"type": "shell", // 任务类型为 shell 命令
"command": "cmake", // 要执行的命令
"args": ["--build", "${workspaceFolder}/build"], // 命令的参数,这里是构建 CMake
"group": { // 任务分组信息
"kind": "build", // 将任务分组为构建类型
"isDefault": true // 设置为默认任务
}
}
]
}
clangd的配置Makefile工程和cmake工程可以用相同的。关于clangd的安装和配置参考我的另一篇博客ubuntu系统vscode配置clangd。
{
// 指定 clangd 可执行文件的路径(如果在系统路径中可直接使用 "clangd")
"clangd.path": "clangd",
// 作为编译失败的备选标志,指定了包含文件夹的路径
"clangd.fallbackFlags": [
"-I${workspaceFolder}/include"
],
// 配置 clangd 启动参数
"clangd.arguments": [
"--background-index", // 启用后台索引
"--compile-commands-dir=${workspaceFolder}", // 设置编译命令文件夹
"--all-scopes-completion", // 允许在所有作用域中进行代码补全
"--completion-style=detailed", // 详细模式的代码补全
"--clang-tidy", // 启用 Clang-Tidy 静态代码分析
"--log=verbose", // 输出详细的日志信息
"--pretty" // 漂亮的输出格式
],
// 配置 CMake 构建目录
"cmake.buildDirectory": "${workspaceFolder}/build",
// 配置 CMake 构建环境变量,使其生成编译命令数据库
"cmake.buildEnvironment": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
}