背景
程序员在做项目写代码时,每完成一个功能,需要自己先测试·一下,看看能不能跑之类的,然后交给测试人员,但是测试人员就代表着用户,用户不需要调试,他们只需要最好的体验,所以程序员给测开人员的代码版本应该是release,而不是debug,但是程序员需要调试,所以程序的发布方式就有了两种,debug和release。·
Linux中,gcc和g++出来的二进制程序默认是release版本,我们需要使用gdb,那么就需要在源代码生成二进制程序时,加上-g选项。
使用
先导准备
接下来开始使用gdb进行调试
我们进入调试后是看不见任何代码的,这对于我们来说是不可忍受的。
list 打印代码,我们实际使用时可以简写为l,后面加上空格和0时表示从头开始打印
直接l就可能会像上图,可能与上次进入光标有关
而且gdb自动记录最近的一条指令,我们输入l后,下一次直接回车,就相当于输入了list
代码是有了,我们可以开始调试,对应在
Visual Studio中,是F5
gdb中,我们输入run,简写为r
由于我门并没有打断点,就直接执行完了。
那么如何打断点呢?
break 行号,简写为b 行号
info b查看断点 (info breakpoints),简写为i b
我们可以打断点了,那么如何执行语句往下走呢?
在Visual Studio中,我们有F10和F11,分别是逐语句和逐过程
gdb中,我们使用next和step,简写为n和s
我们先只使用next
接下来使用step
直接r,然后y,就可以不退出重新调试
进入函数后,发现循环很长,如何跳过?
until 行号 ,执行到行号所在行
或者干脆想退出函数
那就这样做
finish,执行到当前函数结束
我们的思路再重头来过介绍其他指令
打断点打在某个函数上
break 函数名,简写为b 函数名
breakpoint already hit 1 time表示断点被命中。
我们能不能从一个断点执行到下一个断点呢?
continue 简写为c
我们发现断点的执行顺序不是按照序号的,而是按照代码的执行顺序。
那么接下来如何删除断点呢?
delete breakpoints删除所有断点,简写为d
delete breakpoints 断点序号 简写为d 序号
如何禁用断点,如何启用断点?
disable breakpoints 断点序号,简写为disable b 序号,不可写成d b 序号(踩过坑了)
我们发现Enb那一栏由y变成了n,yes-->no
enable breakpoints 断点序号,启用断点 ,简写为enable b 序号,不可写成 e b 序号
接下来我们想到Visual Studio可是有监控窗口的,并且可以查看变量的值,gdb呢?
print,我们可以简写为p,意思是打印值,变量或者表达式的值。
但是监视窗口一般是常显示,我们如何进行常显示?
display变量名,跟踪查看变量,并常显示。
undisplay变量名,取消对变量的跟踪。
现在我们还有一个需求,在不退出调试的情况下修改变量的值
这里写错了,修改一下。
set var 变量,设置变量的值
bt,查看调用堆栈
quit,退出gdb调试