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")
- 在
CMakeLists.txt中加入这三行代码。CMake 中有一个变量CMAKE_BUILD_TYPE,可以取的值是Debug、Release、RelWithDebInfo和MinSizeRel。当这个变量是Debug的时候,CMake 会使用变量CMAKE_CXX_FLAGS_DEBUG和CMAKE_C_FLAGS_DEBUG中的字符串作为编译选项生成 Makefile。 - 在编译程序时加上
-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 系列导读》的路径系统修炼。