使用gdb调试代码及应用举例

it2026-08-06  12

目录

一、GDB 简介二、GDB 命令集三、GDB 调试举例1)gdb 普通调试2)段错误调试 四、总结五、参考资料

本文章所运行的环境为 Ubuntu 18.04 系统。

一、GDB 简介

GDB(GNU Debugger)是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可运行于不同电脑。使用GDB我们可以: – 设置断点使程序停住 – 监视或修改程序中变量的值 – 跟踪代码执行过程编译程序时,通过gcc的-g选项为程序添加调试信息,例如:gcc –g –o helloworld helloworld.c

二、GDB 命令集

file 装入想要调试的可执行文件。kill 终止正在调试的程序。list 列出产生执行文件的源代码的一部分。next 执行一行源代码但不进入函数内部。step 执行一行源代码而且进入函数内部。run 执行当前被调试的程序。c 继续运行程序。quit 终止gdb。watch 使你能监视一个变量的值而不管它何时被改变。backtrace 栈跟踪,查出代码被谁调用。print 查看变量的值。make 使你能不退出gdb就可以重新产生可执行文件。shell 使你能不离开gdb就执行UNIX shell命令。whatis 显示变量或函数类型。break 在代码里设断点,这将使程序执行到这里时被挂起。info break 显示当前断点清单,包括到达断点处的次数等。info files 显示被调试文件的详细信息。info func 显示所有的函数名称。info local 显示当函数中的局部变量信息。info prog 显示被调试程序的执行状态。delete [n] 删除第n个断点。disable [n] 关闭第n个断点。enable [n] 开启第n个断点。ptype 显示结构定义。set variable 设置变量的值。call name(args) 调用并执行名为name,参数为args的函数。Finish 终止当前函数并输出返回值。return value 停止当前函数并返回value给调用者。break命令的使用 根据行号设置断点: (gdb) break linenum 根据函数名设置断点: (gdb) break funcname 执行非当前源文件的某行或某函数时停止执行: (gdb) break filename:linenum(gdb) break filename:funcname 根据条件停止程序执行: (gdb) break linenum if expr(gdb) break funcname if expr

三、GDB 调试举例

下面我们就来创建一个 C 文件并用 gdb 调试。 代码:实现对一个整型数的反转功能,比如输入123,则输出321,当输入100时输出结果却正确。使用 gbd 调试器查找出原因。

1)gdb 普通调试

使用 nano 创建 fan.c 文件

注:若没有nano编辑器,可使用命令:sudo apt install nano 安装。

nano fan.c

fan.c:

#include <stdio.h> void ShowRevertNum(int iNum){ while (iNum > 10){ printf("%d", iNum % 10); iNum = iNum / 10; } printf("%d\n", iNum); } int main(void){ int iNum; printf("Please input a number :"); scanf("%d", &iNum); printf("After revert : "); ShowRevertNum(iNum); }

使用 gcc 时加上 -g ,表示可用 gdb 调试器。

gcc -o fan -g fan.c

打开 gdb 调试 fan 文件。

gdb fan

列出代码及行号:(小写字母 l)

l

设置断点:(让程序在断点的位置停下来,方便我们进行分析)

b 14 (根据行号设置断点) b ShowRevertNum (根据函数名设置断点) info b (查看所有断点信息)

接下来执行程序,我们输入100后,可以看见程序停在了第14行,再来查看一下iNum变量的类型。

run whatis iNum

输入 c 继续执行代码,再打印 iNum 的值。

c p iNum

单步调试:(一步一步调试,可以配合 p 查看变量值)

n

使用 quit 退出 gdb 调试。

quit

2)段错误调试

简介: Linux中,程序崩溃时,一般会产生core文件,记录进程退出前的状态,调试段错误问题,借助于该文件,可快速定位问题。

可按如下步骤生成和使用core文件 Step 1: 让系统产生core文件 ulimit –c num #设定core文件容量(num为数字,为0是不产生core文件) Step 2: 运行程序,让程序崩溃,从而生成core文件Step 3: gdb配合core文件,定位问题 gdb 程序名 core文件名比如: gdb segDemo core

实例: 创建 zhi.c 文件。

nano zhi.c

zhi.c:

#include <stdio.h> int main(void) { int *p=0; *p=1; return 0; }

用 gcc 编译 zhi.c,运行程序使程序崩溃,从而生成 core 文件。

gcc -o zhi -g zhi.c ulimit -c 1000 ./zhi

上面图片中 Segmentation fault 意思为段错误,括号里就表示生成了core文件。

段错误就是指访问的内存超出了系统所给这个程序的内存空间

下面使用 gdb 配合 core 文件定位问题。

gdb zhi core

可以发现,是这个一句代码出现了问题。

四、总结

在调试程序的时候,我们难免会遇到代码出错,可是写了一大堆代码逐条语句的看,是不现实的,也很难发现问题所在,当我们使用 gdb 调试工具时,那工作量可谓是大大降低,所以掌握 gdb 调试应该是每个程序员必备的技能,希望这个博客能对你有帮助,谢谢。

五、参考资料

这个参考资料是我的老师给予我的,我也只是学着做,有兴趣可以看一下: 链接:https://pan.baidu.com/s/1Ndo8oYNcF5XsUYwVjuzuiQ 提取码:92tq

最新回复(0)