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

目录

  • 一、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

使用gdb调试代码及应用举例_第1张图片
列出代码及行号:(小写字母 l)

l

使用gdb调试代码及应用举例_第2张图片
设置断点:(让程序在断点的位置停下来,方便我们进行分析)

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

使用gdb调试代码及应用举例_第3张图片
接下来执行程序,我们输入100后,可以看见程序停在了第14行,再来查看一下iNum变量的类型。

run
whatis iNum

使用gdb调试代码及应用举例_第4张图片
输入 c 继续执行代码,再打印 iNum 的值。

c
p iNum

使用gdb调试代码及应用举例_第5张图片
单步调试:(一步一步调试,可以配合 p 查看变量值)

n

使用gdb调试代码及应用举例_第6张图片
使用 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调试代码及应用举例_第7张图片
可以发现,是这个一句代码出现了问题。

四、总结

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

五、参考资料

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

你可能感兴趣的:(ubuntu,gdb)