如何使用GDB进行代码调试



一、问题描述

基于一个简单的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:行号 - 在特定行设置断点
  • runr - 运行程序
  • nextn - 执行下一行(不进入函数内部)
  • steps - 单步执行(会进入函数内部)
  • print 变量名p 变量名 - 打印变量值
  • continuec - 继续执行直到下一个断点
  • backtracebt - 显示函数调用栈
  • watch 表达式 - 监视表达式的值变化
  • info breakpoints - 列出所有断点
  • delete 断点编号 - 删除指定断点
  • quitq - 退出GDB

2.3.3 调试示例

  1. 启动GDB并加载程序:
gdb ./calculator_debug

输入c即可

  1. 在main函数设置断点:
(gdb) break main
  1. 在除法函数中设置断点:
(gdb) break Calculator::divide
  1. 运行程序:
 (gdb) run
  1. 单步执行并观察变量值:
(gdb) next
(gdb) print a
(gdb) print b
  1. 继续执行直到下一个断点:
(gdb) continue
  1. 退出GDB:
 (gdb) q

三、验证与总结

通过本教程,我们成功使用 GDB 调试了一个 C++ 项目,并掌握了基本的 GDB 调试技巧。GDB 是一个强大的调试工具,熟练掌握它可以极大地提高代码调试效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值