CMake 系列(二十二):让 CMake 支持 GDB 调试

CMake 和 GDB 的结合确实能使 C 或 C++ 的开发工作变得轻松,它们可以共同实现跨平台的项目构建和源代码级别的调试。本文详细介绍如何使用 CMake 配置项目以便使用 GDB 进行调试,并给出一个 C 语言的 demo。

如何支持 GDB 调试

让 CMake 支持 GDB 的设置也很容易,只需要指定 Debug 模式下开启 -g 选项:

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
  1. 在 CMakeLists.txt 中加入这三行代码。CMake 中有一个变量 CMAKE_BUILD_TYPE,可以取的值是 Debug、Release、RelWithDebInfo 和 MinSizeRel。当这个变量是 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile。
  2. 在编译程序时加上 -g 选项的作用是生成带调试信息的可执行文件。这些调试信息包括变量名、函数名、文件名等信息,可以让调试器(如 gdb)在调试程序时更容易跟踪程序的执行过程,并能够查看变量的值、函数的调用栈等信息。通过使用 -g 选项编译程序,可以使得在调试器中更方便地定位程序中的问题,提高调试效率。

代码示例

项目结构如下:

project/
│
├── CMakeLists.txt
└── demo.c

1. 编写 demo.c

#include <stdio.h>

void print_val(int val) {
    printf("value: %d\n", val);
}

int main() {
    int a = 10;
    int b = 20;
    print_val(a);
    print_val(b);
    return 0;
}

2. 编写 CMakeLists.txt

cmake_minimum_required (VERSION 3.10)

# 项目名称
project (demo)

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 添加可执行文件
add_executable(demo demo.c)

3. 编译

在 project 目录下执行命令:

mkdir build
cd build
cmake ..
make

4. GDB 调试

编译成功后,build 目录下生成的就是带调试信息的可执行文件。用 gdb ./demo 启动调试器,先用 b main 在 main 函数处设置断点,再输入 run 让程序运行起来,程序会在断点处停下。之后可以用 n 单步执行,用 p 变量名 查看变量的值,用 bt 查看函数的调用栈。调试结束后输入 q 退出 gdb 即可。

本篇只用了 GDB 的几个基础命令;断点体系、变量查看、多线程调试的完整功力,可以沿着本站《GDB 系列导读》的路径系统修炼。

系列导航


   转载规则


《CMake 系列(二十二):让 CMake 支持 GDB 调试》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Docker 系列导读:从单机容器到 Kubernetes 的完整路径 Docker 系列导读:从单机容器到 Kubernetes 的完整路径
这个系列把 Docker 的知识整理成了一条由浅入深的完整路径:从「Docker 是什么」的第一问开始,经过镜像、容器、仓库三大核心概念与日常操作命令,进入数据管理与网络配置两座大山,再下探到命名空间与控制组的底层实现,最后以 Compos
2022-08-15
下一篇 
CMake 系列(二十一):链接动态库并指定路径的多种方法 CMake 系列(二十一):链接动态库并指定路径的多种方法
实际开发中,需要链接的动态库往往不在系统默认的搜索路径上,这时就需要在 CMake 中显式指定库的位置。本文整理了链接动态库并指定其路径的几种常用方法,并比较各自的适用场景和优缺点。 方法 1:使用 link_directories 指定全
2022-08-02
  目录