Linux——工具(4)gdb调试器
一、准备工作
在了解学习gdb之前,我们需要知道一些知识。
1.我们所编写的程序,有debug和release版本,其中前者是添加调试信息的,后者就没有,我们一般写c/c++都是debug版本,但在Linux中,我们用gcc/g++所编译的文件都是release版本的,但我们的gdb需要我们以debug版本发行,所以我们需要改动一下,只需要在原来的gcc指令后面加-g选项即可。
本篇内容我们的重点主要是介绍gdb的相关指令使用
二、gbd的基本语法
gdb是干什么用的,它是一个调试器,相当于我们vs软件中的各个操作的集合软件,比如逐语句运行,打断点等等。
语法很简单,只需要gbd后面加要调试的程序即可,我们先简单写一个小程序并用一下gdb指令
这样我们就进入了gdb调试部分,想退出只需要输入quit即可。
三、gdb的相关指令
1.gdb会记住最新的一条命令,当我们输入回车时会继续执行一次最新的命令
2.查看代码 l+数字
我们发现一个问题,进入到gdb后我们好像无法看到代码,代码都看不到更别谈如何调试了,所以我们第一个命令就是l+数字来查看代码,数字输入几就会展示从该行向下的10行代码(并不会完全显示)如果我们想继续向下显示可以按几次回车(参考第一条原理)。
此外,我们也可以输入l+函数名来展示有该函数名的所在行代码以及我们也可以输入l+文件名:行号来展示指定文件的目标行代码。
3.打断点
使用vs时我们知道,想查看一个大文件哪里出现了问题,调试中的断点是非常重要的,在Linux中的调试也是如此。Linux中的断点我们输入b即可
b+行号:在该行打上断点
info b:查看已打的断点信息
我们添加断点的时候可以是用行号,但删除断点就不行了,删除断点的命令为d,但d后面跟的不是行号,而是我们的断点编号,也就是我们的第几个断点,比如d 3表示我要删去我第三个标记的断点。在我们一个调试周期下,断点编号是线性递增的,比如我一开始打了三个断点然后都删除了,此时我再打一个,这个编号就是4。当我们退出此次gdb一个周期结束。
而且,我们也可以像l命令一样,用b加函数名来打断点。
禁用断点:我们想在此处加断点,但又不想程序在这里停下来而设置的断点。Linux中禁用断点我们用disable+断点编号
其中的enb就是是否是禁用断点,n代表已禁用。
4.r命令(run):运行代码(遇断点会停)
5.逐过程运行(按代码块运行,不会逐语句进入到函数内部) :n命令(next)
6.逐语句运行(可以进入函数内部):s(step)
7.监视变量:display+变量。去掉输入undisplay+变量编号即可
8.p+name:打印一个变量(或地址)的值。
9.until+行数:直接跳转到该行,一般用于查看多次循环后的结果。
10.finish :把当前所在的函数所有语句跑完
11.c:从当前位置连续执行语句(continue)
四、比gdb更优的选择——cgdb
我们发现,当我们用gdb调试的过程中,如果我们的次数过多,会导致之前用命令显示的代码给覆盖掉,也就是不能保证持续的可视化,而有一款调试器,它能做到调试的过程中,始终保持代码的可视性,也就是cgdb,安装方法如下:
sudo yum install -y cgdb
而且,这个cgdb和我们gdb的指令几乎是 完全相同的
五、watch与
watch用于监视程序执行时的一个表达式的值。如果监视的对象在程序运行期间的值发生变化,gdb会停止运行并告知使用者。我们想观察谁直接watch+name即可,也可以同时watch多个对象。
六、条件断点
条件断点也是断点,它只是会在特定条件下才会触发,正常情况下不会影响代码的执行。
b n if(条件)
其中n为行号,我们用打断点的命令来打条件断点。除此之外,我们也可以在原有的断点追加一个条件使其变成条件断点。
condition 断点编号 条件
————关于gdb的基本操作我们就介绍到这里