Linux下GDB的初步调试——实例

摘要:应用程序的调试是开发过程中必不可以的环节之一。Linux下的GNU的调试器称为GDB(GNU Debugger),所以就让我们先来初识一下GDB吧~
关键词:Linux,GDB

一、 GDB的介绍

●GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。
●使用者能在程序运行时观察程序的内部结构和内存的使用情况。
●GDB是一种基于命令行工作模式下的程序,工作在字符模式,由多个不同的图形用户界面前段予以支持,每个前端都能以多种方式提供调试控制能力。
以下是GDB所提供的的一些功能。

  1. 启动程序,并且可以设置运行环境和参数来运行指定程序。
  2. 让程序在指定断点处停止执行。
  3. 对程序作出相应的调整,这样就能纠正一个错误后继续调试。

注意:
GDB调试的是可执行文件,而不是源程序。如果想让GDB调试编译后生成的可执行文件,在使用GDB工具调试程序之前,必须使用带有- g-gdb编译选项的GCC命令来编译源程序。

例如:

gcc -g -o test test.c

使用GDB命令的语法如下。

gdb [参数] Filename

下面列举一些常用的参数

●-help:列出所有参数,并作简要说明
●-symbols=file
-s file:读出文件(file)的所有符号
●-core
-c:这里的core是程序非法执行后core dump后产生的文件
●-directory
-d:加入一个源文件的搜索路径。默认搜索路径是环境变量中的PATH所定义的路径
●-quiet
-q:使用该选项不显示GDB的介绍和版权信息等

二、 GDB的调试命令

运行GDB调试程序通常使用如下的命令。

命令说明
file指定要调试的可执行程序
kill终止正在调试的可执行程序
next执行一行源代码但并不进入函数内部
list部分列出源代码
step执行一行源代码并不进入函数内部
run执行当前可执行程序
quit结束GDB调试任务
watch可以检查一个变量的值而不管它何时被改变
print打印表达式的值到标准输出
break N在指定的第N行源代码设置断点
info break显示当前断点清淡,包括到达断点处的次数等
info files显示被调试文件的详细信息
info func显示所有函数名
info local显示当函数中的局部变量信息
info prog显示被调试程序的执行状态
info var显示所有的全局和静态变量名称
make在不退出GDB的情况下运行make工具
shell在不退出的情况下运行shell命令
continue继续执行正在调试的程序

三、 GDB调试实例

先检查一下ubuntu中是否已经安装了GDB

gdb -v

在这里插入图片描述
目前Ubuntu中已装有GDB,如果没有预装GDB请自行下载。下来我们就来测试一下GDB吧。

3.1 首先创建一个test.c

vim test.c

test.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);
}



上面的代码可以逆序输出一个整型数,比如输入123,则输出321。

先来编译出可执行文件,看看有没有语法错误。

3.2 使用gcc生成可执行文件并编译运行

gcc -o test1 test.c
./test1

在这里插入图片描述

语法没有报错,但明显出现了逻辑错误。可以看出该代码实现了整数的逆序输出,但当输入100时,逆序输出了010.这时就要派GDB出场了。

3.3 进入gdb

gcc -o test1 -g test.c
gdb test1
提示:进入gdb是必须在命令行键入关键参数 -g

GDB进入界面

在这里插入图片描述
出现了(gdb)后就可以在其提示符后输入相应的调试命令了。

如果不希望出现gdb的系统进入信息提示,可以输入一下命令
gdb -q Filename

在这里插入图片描述

-c:继续执行程序(直到下一个断点或者之后没有断点就运行完整个程序)。

由断点设置来看,iNum的参数类型并没有出现问题。

下来我们就试试-n来检查逻辑错误

-n:一步一步执行程序

在这里插入图片描述

通过调试发现,当 iNum=10时,iNum>10为 0,所以程序直接跳出循环,输出 iNum,即 10;因此,最终输出结果为 010。

通过 gdb 调试发现了逻辑错误,即当 iNum=10时,程序会跳出循环,为防止此时程序跳出,只需将 while (iNum > 10) 修改为 while (iNum >= 10)即可。
至此gdb调试初步完成。

四、 总结

通过此次gdb初步调试,使我基本了解了gdb的工作原理以及运用场景,以及基本掌握了gdb的调试命令。应用程序的调试是开发过程中必不可以的环节之一,使用GDB可以快速,高效的完成程序的设计与纠错。

五、 参考资料

1.《嵌入式Linux系统开发教程》,电子工业出版社,华清远见嵌入式学院。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值