20231302-邱之钊-gdb调试

邱之钊同学,你好!

今天我们来学习一个非常重要的开发工具——gdb调试器。作为未来要在国产化操作系统上工作的开发者,掌握调试技能对你特别关键。我注意到你基础一般,没关系,调试本身就是从不断犯错中学习的艺术,我会带着你一步步掌握。

我们先在openEuler系统上创建一个测试文件。打开终端,输入:

vim testgdb.c

屏幕截图 2025-09-25 141047

然后输入以下代码(我特意设计了函数调用和循环结构来练习调试):

#include <stdio.h>

int calculate(int n) {
    int sum = 0;
    for(int i = 1; i <= n; i++) {
        sum += i;
    }
    return sum;
}

int main() {
    int result = calculate(5);
    printf("1+2+3+4+5 = %d
", result);
    
    for(int i = 0; i < 3; i++) {
        printf("循环次数: %d
", i);
    }
    
    return 0;
}

image

编译时记得加上 -g 参数,这样gdb才能显示调试信息:

gcc -g testgdb.c -o testgdb

现在开始调试之旅。首先启动gdb:

gdb ./testgdb

你会看到gdb的提示符 (gdb),接下来我们逐个学习核心命令:

  1. help - 查看帮助
    输入 help 可以看到所有命令分类,help breakpoints 专门查看断点帮助

  2. run - 启动程序
    输入 run 程序会完整执行一遍。但我们现在要调试,所以需要先设置断点

  3. break - 设置断点(4种类型演示)

break main          # 函数断点:在main函数入口暂停
break testgdb.c:10  # 行断点:在源文件第10行暂停
tbreak 15           # 临时断点:第15行暂停一次后自动删除
break 7 if i == 3   # 条件断点:当变量i等于3时暂停
  1. continue - 继续执行
    设置断点后输入 run,程序会在断点处暂停。输入 continue 会继续执行到下一个断点

  2. next 和 step - 单步执行

next # 执行下一行代码(不进入函数内部)
step # 执行下一行代码(会进入函数内部)
6. until - 快速跳出循环
当你在循环体内时,输入 until 会直接执行完当前循环

  1. finish - 执行完当前函数
    在函数内部时,输入 finish 会执行完当前函数并暂停在返回处

  2. print - 查看变量值

print sum      # 查看sum变量的值
print &result  # 查看result变量的地址
  1. display - 自动显示变量
display i      # 每次暂停时自动显示i的值
display sum    # 每次暂停时自动显示sum的值

现在让我们实际操作一遍。在gdb中依次输入:

break main
run
next
step
display i
display sum
continue

image

记住调试的核心逻辑:设置断点 → 运行 → 查看变量 → 单步跟踪 → 发现问题。就像侦探破案一样,在每个关键位置设置"监控点"(断点),观察变量的变化过程。

你可能会问为什么需要这么多命令?因为调试不同场景需要不同工具:next 用于快速跳过已知正常的函数,step 用于深入可疑函数内部,until 帮我们避免在循环中一次次next。

在实际开发中,90%的bug都是通过设置 strategic breakpoints(战略断点) 找到的。比如在国产化系统开发中,遇到硬件相关问题时,往往需要在关键接口函数设置断点,然后查看参数传递是否正确。

建议你今天按照这个流程练习3遍:1)编译带调试信息的程序 2)设置4种断点 3)使用单步命令 4)观察变量变化。动手实操是最好的学习方法,遇到问题随时记录下来,下次我们可以重点讨论。
以下是设置的四种断点:
条件断点:
image
临时断点:
image
行断点:
image
函数断点:
image

作业提交要求 (1')
拷贝出AI生成的所有内容,把你实践编译和测试过程截图插入,AI生成内容不满意,可以刷新一下,代码可能不能直接使用,需要你做简单修改
(选做)推荐所有作业托管到 gitee或 github 上
(必做)提交作业 markdown文档,命名为“学号-姓名-作业题目.md”
(必做)提交作业 markdown文档转成的 PDF 文件,命名为“学号-姓名-作业题目.pdf”

posted @ 2025-09-25 16:54  20231302邱之钊  阅读(15)  评论(0)    收藏  举报