Linux下gdb的使用

在Linux中用vim写代码,但是不可能每次写的代码都没有错误,如果出错了,该怎么找出错误呢? 在Linux中有个Linux专门的调试器—gdb,我们要学会使用gdb,这样对我们在Linux环境下编写代码有好处。
我们在Linux下写了这么一段代码:
在这里插入图片描述
这段代码的功能是将数组arr中的每个元素加起来,将结果返回给sum。
在这里插入图片描述
运行的结果如图所示,sum=3,很明显,结果是错误的,按理来说结果应该是55。

那么是哪里错了呢?
此时如果我们看不出来代码是哪里错了,就必须借助调试器来调试代码,这样才能看到我们的代码哪里出现了错误,才能将其改正!
大家都知道,程序发布方式有两种,一种是release模式,一种是debug模式。Linux中gcc/g++生成的可执行程序默认是release模式的,但是我们要使用gdb调试,就必须在生成可执行程序时加上-g选项,让其生成debug模式的可执行程序。
在这里插入图片描述
这是没有加-g选项下的release模式的可执行程序,不能进行调试。
在这里插入图片描述
加了-g选项后程序可以用gdb进行调试了。

gdb调试的命令如下:
list / |行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至Xbreaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb

有了这些,我们就可以调试代码了。
在这里插入图片描述
首先,l(list)列出10行,接下来在主函数处b(break) 11打个断点,info break可以看到我们下的断点的信息。
在这里插入图片描述
接下来我们在函数调用处打个断点,把1断点删除(delete points 11),按r让程序运行,在断点处停了下来,接着按s(step)进入函数调用里面。
在这里插入图片描述
我们按p(print)打印变量的值,观察到sizeof(arr)为8,sizeof(arr[0])为4,len的值为2。
理论上sizeof(arr)的值应该为40,len的值应该为10。
在这里插入图片描述
我们此时就知道了,通过实参传过去的arr为数组的首地址,实际上是一个指针,这个机器是64位平台(uname -a命令进行查看平台大小),一个指针大小为8,所以sizeof(arr)为8。

在这里插入图片描述display命令可以常显示变量的值,按n执行下一步,最后sum的值为3.

至此,我们明白了为什么程序结果不对,按q退出调试。

在这里插入图片描述
更改我们的代码。。。
在这里插入图片描述
此时再次运行,结果为55,正确!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值