调试器gdb /cgdb的使用
②使用finish,是让在函数内跑,函数结束代码直接出结果,而我们的先打断点在用r,结果就是代码会直接跑到断点处停下来,如果我们的断点打在main函数中函数声明处,我们使用s,让直接进入对应的函数内部逐语句执行,这样就可以让我们看到在对应函数内跑完一次的结果了;⑦set var +次数,可以在程序运行期间把对应的某个值直接改掉,然后做对应的调试,其实也就是说,有的循环条件是<=100,但你想让它跑
引言
程序发布的模式有两种,debug模式和release模式,值得注意的是linux gcc/g++出来的二进制文件默认是release模式;这两个模式有什么区别呢?一句话概括就是:Debug 是“开发模式”,方便调试找 bug;Release 是“发布模式”,让程序跑得更快;
之所以这样是因为debug模式下文件包含调试信息,可以使用gdb调试,并且debug模式和release下的执行命令也不相同,debug模式下多了一个 -g 选项;详细区别可看下图
呢么在linux中我们如何调试我们的代码呢?接下来就让我们简单学习一下;

这是我们平常写的makefile文件没有 -g 选项,当我们带上 -g 选项我们发现文件列表中多了一个我们刚新创建的test_debug文件;

现在我们来详细的看着两个文件的区别是什么,

我们发现,不带-g选项的文件没有以上的调试信息,而带-g选项的文件带以上的调试信息;
注释:
readelf -S test_debug | grep -i debug由多个部分组成:readelf是一个专门用于读取 ELF(Executable and Linkable Format,即 Linux 可执行文件的标准格式)文件信息的工具;①选项
-S是--section-headers的简写,作用是显示文件的 section 头信息,可以理解为展示该二进制文件的“目录结构”;
②test_debug则是指定要检查的目标文件名。③管道符
|的作用是将前面readelf命令的输出结果,作为输入传递给后面的命令。④最后的
grep是一个强大的文本搜索工具,而它的-i选项是--ignore-case的简写,意味着在搜索关键词debug时会忽略大小写,因此能够同时匹配到debug、DEBUG或Debug等不同写法。综上所述,这条命令的功能就是查看
test_debug这个文件的内部结构,并从中筛选出所有包含“debug”字样的调试信息段,从而快速判断该程序在编译时是否添加了-g调试选项。
调试的时候使用命令 gdb + 我们前面生成的debug模式下的代码;

下面我们开始学习gdb的对于调试代码的指令:
1. list 简写 l: 作用是呈现我们调试的代码, l 1 的意思是从第一行显示代码,默认每次显示10行,如果向显示多一点,直接按回车就行;这是因为gdb会记录一条最新的命令,所以直接按回车就行;

如果想看第15行的内容,就会取个中间数,也就是下面的样子;

如果我们想要查看我们写的代码中的一个函数Sum,也很简单,l + 函数名即可;

总结一下命令,就是下图

2.r 命令 : 让我们的代码直接跑起来,跑完;相当于F5;

但是在VS中我们是有打断点的,在gdb中如何实现呢? 当然也有对应的命令啦,这个命令就是b,全称为breakpoint ,使用就是 b+你要打断点的行号;

如何查看我们打的断点呢?使用命令info b即可;

呢如果我们不想要这个断点了呢? d +前面打短点的行号? 当然不是,得使用前面info b中的断点编号,也就是上图中num下面的数字;
也可以给指定文件打断点
![]()
也可给指定的函数打断点

值得注意的是,在一个调试周期下,我们断点的编号是递增的;换句话说,不会因为你删了就从0再开始;
但有时候我们还会想让断点先失去能力,也就是先把断点禁用,怎么办呢?

如果想要让它在恢复能力,用下面的命令;

如果我们想要让代码逐过程执行,可以使用下面的命令 ,next 的简写 n,相当于VS中的F10

使用s 全称为step 可以使代码逐语句执行,相当于F11;

如何让代码常显示呢?也就是VS中可以看到特定变量的值,并根据循环改变大小呢?
使用命令 display ,再按 n,这样就可以跟着我们想要的走了,不想要常显示,使用命令undisable + 编号;



p 命令,相当于printf ,作用是打印变量,当然也可以打印地址;



until + 行号 :作用是直接跳转到对应的行号

好了,以上就是我们的gdb的一些基本指令,下面我们来学一下cgdb;
什么是cgdb?
CGDB 就是在终端里给 GDB 穿上了一件“图形化外衣”,让你调试 C/C++ 程序时更舒服、更直观。
安装指令为:
sudo yum install -y cgdb
还是和gdb一样,开启cgdb的命令也是cgdb + 文件名;cgdb会自动为我们分屏;

我们可以看到16行就是我们打的断点,

现在我们在下面在16和19行打上断点,看我们的调试的时候上面的分屏会怎那么显示;如我们所料它会像在VS中一样在两个断点中循环显示,使用r 和n 命令后我们就能看到现象;
好啦,调试工具我们已经学会但是我们作为程序员使用调试器的主要是为了找到问题,现在我们来学习如何找到问题;
①可以使用打断点,将代码分模块找问题,然后使用c(continue),执行任意的两个相连的断点;
②使用finish,是让在函数内跑,函数结束代码直接出结果,而我们的先打断点在用r,结果就是代码会直接跑到断点处停下来,如果我们的断点打在main函数中函数声明处,我们使用s,让直接进入对应的函数内部逐语句执行,这样就可以让我们看到在对应函数内跑完一次的结果了;


③使用info locals 就可以显示两个断点中间的所有变量现在的值,这个其实最相当于我们VS中的F5下的自动窗口;
⑥有时候我们在实际使用调试的时候还会想要一直监视一个参数,这个应该使用什么命令呢?
答案是watch ,其实watch也相当于是打一个断点,所以去掉也是用d,只不过watch在监视结束之后会告诉我们old value和New value;通常用来监视一些不可变的变量;

⑦set var +次数,可以在程序运行期间把对应的某个值直接改掉,然后做对应的调试,其实也就是说,有的循环条件是<=100,但你想让它跑到5就停止,就可以把100的值对应的参数先改成5;
⑧条件断点 :
打法是 b +行号 +条件

更多推荐

所有评论(0)