Ubantu系统上进行程序代码的GDB调试

一、GDB简介

(一)介绍

GDB : GNU Debugger,GDB是GNU开发的一个Unix/Linux下强大的程序调试工具。GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序。

(二)功能

1、启动你的程序,可以按照你的自定义的要求运行程序。
2、可让被调试的程序在你所设定的调置的断点处停住。
3、跟踪代码执行的过程,监视或修改程序中变量的值。
4、你可以改变你的程序,将一个BUG产生的影响修。

二、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具体使用

(一)编辑程序

1.使用vim创建文件,将代码输入。

vim example.c

2.源代码:

#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但输入100时,程序的输出结果却不正确。
3.进入vim后,直接将程序代码粘贴即可(在下使用的ubantu18.04版本,如果不可以复制等功能,可以使用shell等工具或者用键盘输入,熟悉代码!),也可以使用自己的程序哟!退出时,按键盘上面“Esc”,再输入“:wq”,表示存储并退出。

(二)编译程序

1.使用gcc生成可执行代码。

gcc -o example example.c

2.执行程序。

./example

3.输入123和100对程序进行测试。
在这里插入图片描述
我们可以看到,输入123时,程序能够输出正确结果321,即将输入数字倒序,但是输入100的时候,输出结果为010,而我们却想得到001,所以程序有Bug!有的伙伴会说上述功能可以用数组实现,别急别急!咱先一步一步看完。

(三)调试程序

1.输入命令,进入调试。

gdb example

2.输入相关命令,并进行调试,可参照“GDB相关命令”进行调试哦,下面图片也有展示,大家可以参考。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里我们可以发现问题了,当iNum等于10之后便不再进入循环,但是我们需要包含10,才可以在100甚至1000…等这些相对比较特殊的数字实现倒序的功能,所以我们可以修改代码了!!!
4.可以使用命令退出GDB调试咯。

gdb qiut

(四)修改程序

1.用vim命令进入,编辑代码。

vim example.c

不是vim example,不然你将会看到一堆乱码。
2.将程序代码“while (iNum > 10)”修改为“while (iNum >= 10)”,具体代码如下展示(可以直接复制过去嗷)。

#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);
}

3.一定要再编译一下,再运行程序。

gcc -o example example.c
./example

4.输入100,测试结果,如下图所示:
在这里插入图片描述

四、总结

写程序代码,不经意间就出现了令人头大的Bug,有时候出错的地方不容被发现,通过GDB调试,可以一步一步根据需求观察数据变化,进行调试,是一个很实用的功能,不过熟悉需要一定的时间哦,大家冲冲冲!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值