20231302-邱之钊-gdb调试
邱之钊同学,你好!
今天我们来学习一个非常重要的开发工具——gdb调试器。作为未来要在国产化操作系统上工作的开发者,掌握调试技能对你特别关键。我注意到你基础一般,没关系,调试本身就是从不断犯错中学习的艺术,我会带着你一步步掌握。
我们先在openEuler系统上创建一个测试文件。打开终端,输入:
vim testgdb.c

然后输入以下代码(我特意设计了函数调用和循环结构来练习调试):
#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;
}

编译时记得加上 -g 参数,这样gdb才能显示调试信息:
gcc -g testgdb.c -o testgdb
现在开始调试之旅。首先启动gdb:
gdb ./testgdb
你会看到gdb的提示符 (gdb),接下来我们逐个学习核心命令:
-
help - 查看帮助
输入 help 可以看到所有命令分类,help breakpoints 专门查看断点帮助 -
run - 启动程序
输入 run 程序会完整执行一遍。但我们现在要调试,所以需要先设置断点 -
break - 设置断点(4种类型演示)
break main # 函数断点:在main函数入口暂停
break testgdb.c:10 # 行断点:在源文件第10行暂停
tbreak 15 # 临时断点:第15行暂停一次后自动删除
break 7 if i == 3 # 条件断点:当变量i等于3时暂停
-
continue - 继续执行
设置断点后输入 run,程序会在断点处暂停。输入 continue 会继续执行到下一个断点 -
next 和 step - 单步执行
next # 执行下一行代码(不进入函数内部)
step # 执行下一行代码(会进入函数内部)
6. until - 快速跳出循环
当你在循环体内时,输入 until 会直接执行完当前循环
-
finish - 执行完当前函数
在函数内部时,输入 finish 会执行完当前函数并暂停在返回处 -
print - 查看变量值
print sum # 查看sum变量的值
print &result # 查看result变量的地址
- display - 自动显示变量
display i # 每次暂停时自动显示i的值
display sum # 每次暂停时自动显示sum的值
现在让我们实际操作一遍。在gdb中依次输入:
break main
run
next
step
display i
display sum
continue

记住调试的核心逻辑:设置断点 → 运行 → 查看变量 → 单步跟踪 → 发现问题。就像侦探破案一样,在每个关键位置设置"监控点"(断点),观察变量的变化过程。
你可能会问为什么需要这么多命令?因为调试不同场景需要不同工具:next 用于快速跳过已知正常的函数,step 用于深入可疑函数内部,until 帮我们避免在循环中一次次next。
在实际开发中,90%的bug都是通过设置 strategic breakpoints(战略断点) 找到的。比如在国产化系统开发中,遇到硬件相关问题时,往往需要在关键接口函数设置断点,然后查看参数传递是否正确。
建议你今天按照这个流程练习3遍:1)编译带调试信息的程序 2)设置4种断点 3)使用单步命令 4)观察变量变化。动手实操是最好的学习方法,遇到问题随时记录下来,下次我们可以重点讨论。
以下是设置的四种断点:
条件断点:

临时断点:

行断点:

函数断点:

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