作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
- 一、Linux中的debug和release
- 二、gdb的使用
- ==**1.进入调试**==
- ==**2.显示代码**==
- ==**3.执行和断点**==
- ==**4.逐语句和逐过程**==
- ==**5.显示变量**==
- ==6.断点之间的执行==
- ==7.启动断点和禁用断点==
- 三、总结
前言
这篇讲给大家介绍关于Linux中的调试,它和vs的操作思想是一样的,帮助我们调试代码,所以关于一些调试名词的大家是知道的,这篇的指令选项特别多,大家下来要好好练习,不然很容易忘,在vs讲调试之前,我们也介绍过关于debug和release的介绍,在Linux上也有着两个版本,我们话不多说,开始进入正文
一、Linux中的debug和release
在Linux上,我们gcc/g++默认生成的是动态的release版本的可执行程序,我们使用 -g 选项就可以使可执行程序变成debug版本的,这样才有调试信息。
我们看到debug版本的可执行程序比release版本的体积要大些,因为增加了调试信息。
我们来使用一个readelf
指令来看看生成的文件是否有debug调试信息
我们在平时写代码的时候加一个-g生成debug版本才能进行调试。这篇我的可执行程序都是debug版本的。接下来开始正式介绍gdb调试器
二、gdb的使用
在讲解这个之前,我希望大家看看我之前这篇博客写关于vs上的调试vs上的调试技巧,接下来的一些名词我就不具体给大家介绍了,我对标vs上的调试给大家讲解,接下来我们先把准备工作做好。写一个程序,把自动化构建写好,在vs上准备一份相同的代码,方便做对比:
1.进入调试
gdb+可执行程序
此时你就进入调试,相当于vs的CTRL+F10
2.显示代码
我们进入调试之后,是看不见代码的,所以我们要将其显示出来,使用l
指令
l默认从随机位置开始每次显示10行直到显示结束,想要从第一行开始展示输入指令
l 0
从第一行开始显示:
注意:gdb会记录上一条的命令,如果你下一条想要执行相同的命令,就可以直接回车就好了
3.执行和断点
断点是我们调试一个重点的东西,它可以不让我们从第一行开始调试,直接跳到想要行开始调试。
(1) 设置断点b+行号
(2)显示断点info b
这个显示也可以直接把你的断点编号显示出来,最后显示的是第几行断点
(3)删除断点d+编号
我们不能通过行号删除断点,只有通过编号才能删除断点
(4)开始调试
我们刚才进入调试,还没有开始调试,输入r
开始调试。
在没有断点的情况下,这个指令就相当于运行程序,并不会像vs上停在main函数的入口:
在有断点的情况下,会跳到最近的断点处
4.逐语句和逐过程
这个是调试的关键步骤,我们的逐语句是一条一条语句的的执行,逐过程是一次执行一个过程,不会进入函数体内
(1)逐过程n
会跳到下一个过程,有空格也会跳过
(2)逐语句s
进入函数内部
当你正在调试的时候,像重新调试,就再次输入r,从头开始调试
(3)查看函数堆栈bt
(4)快速结束此次函数的运行finish
这个在vs上是没有的,如果你刚进入函数体内,就像出来,就使用Finnish命令:
(5)函数体内跳到指定行until+行号
这个也是vs上没有的,但是这个命令只建议在函数体内使用,不建议从另一个函数跳到另一个函数。
5.显示变量
(1)调试的一个重要环节就是查看你想要的变量值,看看和你想的有什么变化
我们使用p+变量
命令
但是我们在vs上的变量是一直可以看到的,不是像现在每次都要输入指令才能看到,而且没有显示变量名,所以我们接下来要使用常显示命令display+变量
虽然没有vs上看到直观,这也是命令行的缺点
(2)删除变量undispaly+编号
这个和删除断点一下,需要通过编号来进行删除
6.断点之间的执行
在vs上我们打两个以上断点,通过F5就可以进行断点之间的执行
在gdb中可以使用c
来进行断点之间的执行
7.启动断点和禁用断点
禁用断点就是是此断点失能,但是断点还在,我们来看看gdb上的是什么样的
禁用断点disable+编号
启动断点enable+编号
三、总结
大家对于gdb的命令了解我今天所讲的这些就行了,大家下来孰能生巧就好,就好比vs上的调试没有什么难度,要多用,就会了,今天博主的分享就到这里了,我们下篇再见