在Ubuntu18.04中的程序代码的GDB调试

一、GDB的使用

1、安装GDB

输入命令:

sudo apt-get install gdb

运行结果:
在这里插入图片描述

2、启动GDB

输入命令:

gdb

运行结果:
在这里插入图片描述

3、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给调用者

4、GDB调试实例

  • 首先创建一个C语言文件test.c
touch test.c
vim 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。

  • 使用gcc生成可执行文件并编译运行
gcc -o test1 test.c
./test1

运行结果:
在这里插入图片描述
可以看到,在输入100的时候输出结果是错误的

  • 下面开始用GDB进行调试
  • 进入gdb
gcc -o test1 -g test.c
gdb test1
  • 输入l查看代码
    运行结果:
    在这里插入图片描述
  • 下断点
    在这里插入图片描述
  • 发现问题
    在这里插入图片描述
    经过一步一步查看值的变化,发现iNum变成10了之后就不会再进入循环了,所以循环条件应该是大于等于10,我们要对错误进行修改,需要先退出gdb再进行对代码的修改。
  • 修改程序,解决问题
    在这里插入图片描述
    程序编译运行后,输入100,得到正确的结果

二、内存出错的GDB调试

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

  • 首先让Linux系统产生core文件
    新建一个C语言文件,输入以下代码:
#include<stdio.h>
int main(void)
{
int *p=0;
*p=1;
return 0;
}

然后输入命令:

 ulimit –c 100

让系统产生core文件,运行程序,让程序崩溃,产生core文件,使用gdb配合core文件,定位问题

三、总结

通过对在Ubuntu下进行gdb调试,可以在检查程序的运行状态,帮助我们更好的了解自己程序的错误,提高效率,尽快解决错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值