文章目录
一、问题描述
基于一个简单的C++项目,专门设计用于演示如何使用GDB进行代码调试。
二、具体内容
2.1 项目结构
├── CMakeLists.txt # CMake配置文件
├── include/ # 头文件目录
│ └── calculator.h # 计算器类的头文件
└── src/ # 源文件目录
├── calculator.cpp # 计算器类的实现
└── main.cpp # 主程序
2.1.1 CMakeList.txt
cmake_minimum_required(VERSION 3.10)
project(CppDebugDemo VERSION 1.0)
# 指定C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加调试信息
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -Wall")
# 指定include目录
include_directories(include)
# 添加源文件
file(GLOB SOURCES "src/*.cpp")
# 创建可执行文件
add_executable(calculator_debug ${SOURCES})
2.1.2 calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator {
public:
Calculator();
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
float divide(int a, int b);
private:
int lastResult;
};
#endif // CALCULATOR_H
2.1.3 calculator.cpp
#include "../include/calculator.h"
Calculator::Calculator() : lastResult(0) {}
int Calculator::add(int a, int b) {
lastResult = a + b;
return lastResult;
}
int Calculator::subtract(int a, int b) {
lastResult = a - b;
return lastResult;
}
int Calculator::multiply(int a, int b) {
lastResult = a * b;
return lastResult;
}
float Calculator::divide(int a, int b) {
if (b == 0) {
// 这里故意添加一个可能的错误情况,用于演示调试
return 0;
}
lastResult = a / b;
return static_cast<float>(a) / b;
}
2.1.4 main.cpp
#include <iostream>
#include "../include/calculator.h"
int main() {
Calculator calc;
// 测试基本运算
int a = 10;
int b = 5;
std::cout << "Testing calculator operations:\n";
int sum = calc.add(a, b);
std::cout << a << " + " << b << " = " << sum << std::endl;
int diff = calc.subtract(a, b);
std::cout << a << " - " << b << " = " << diff << std::endl;
int product = calc.multiply(a, b);
std::cout << a << " * " << b << " = " << product << std::endl;
// 测试除法,包括除以0的情况
float quotient = calc.divide(a, b);
std::cout << a << " / " << b << " = " << quotient << std::endl;
// 故意制造一个除以0的情况,用于调试
float result = calc.divide(a, 0);
std::cout << "Division by zero result: " << result << std::endl;
return 0;
}
2.2 构建项目
# 创建构建目录
mkdir build
cd build
# 生成构建文件
cmake ..
# 编译项目
make
2.3 使用GDB调试
2.3.1 基本调试步骤
# 在build目录中
gdb ./calculator_debug
2.3.2 常用GDB命令
break main
- 在main函数设置断点break src/calculator.cpp:行号
- 在特定行设置断点run
或r
- 运行程序next
或n
- 执行下一行(不进入函数内部)step
或s
- 单步执行(会进入函数内部)print 变量名
或p 变量名
- 打印变量值continue
或c
- 继续执行直到下一个断点backtrace
或bt
- 显示函数调用栈watch 表达式
- 监视表达式的值变化info breakpoints
- 列出所有断点delete 断点编号
- 删除指定断点quit
或q
- 退出GDB
2.3.3 调试示例
- 启动GDB并加载程序:
gdb ./calculator_debug
输入c即可
- 在main函数设置断点:
(gdb) break main
- 在除法函数中设置断点:
(gdb) break Calculator::divide
- 运行程序:
(gdb) run
- 单步执行并观察变量值:
(gdb) next
(gdb) print a
(gdb) print b
- 继续执行直到下一个断点:
(gdb) continue
- 退出GDB:
(gdb) q
三、验证与总结
通过本教程,我们成功使用 GDB 调试了一个 C++ 项目,并掌握了基本的 GDB 调试技巧。GDB 是一个强大的调试工具,熟练掌握它可以极大地提高代码调试效率。