linux下的调试工具gdb的详细使用介绍

 在之前学习中我们使用的通常是集各种功能于一体的编译器,例如VS stdio,但是一个程序在编辑后还要进行编译,然后才能产生一个二进制的可执行文件,编辑和翻译工作都可以使用不同的软件进行,例如记事本就是一款编辑软件,除了编辑和翻译,还有一种功能在我们的学习过程中常常会用到,那就是调试。
 今天就带大家仔细学习如何在LInux(我使用的Linux版本是centos7.6。)下使用gdb对C程序进行调试。我会先进行讲解,然后会用截图进行演示,确保大家看到现象。
首先要知道自己是否下载调试工具gdb,我们可以通过这个指令进行查看。

gdb --version

在这里插入图片描述

 这样就能看到我们该操作系统下是否下载gdb,也可以详细看到他的版本,如果没有下载的话只需要使用yum指令进行下载即可。
在这里插入图片描述
 要注意,如果是普通用户需要进行提权才能下载,如果是root(超级用户)就不需要加上前边的sudo,因为我之前已经下载过了而且版本也是最新的,所以最下边告诉我什么都没有做。
准备工作已经结束,接下来进入正题
 首先一个常识就是,只能在degug模式下进行调试,因为release版本并没有调试信息,但是Linux下默认是release版本,所以我们要在编译时加上-g选项。
我们随便写一点C代码。
在这里插入图片描述
 如何证明加上-g选项产生的可执行文件是debug模式的呢?
 可以在使用默认release模式进行编译产生一个新的文件exe。
在这里插入图片描述
 通过大小我们可以明显看出a.out的大小是要大于exe文件的。还有一种方法就是直接使用gdb进行调试,如果能调试就一定是debug版本,如果不能就是release版本。
在这里插入图片描述
对比一下
在这里插入图片描述
 首先,从gdb模式下退出是q指令。输入q键后直接敲回车就退出到命令行模式。
l指令
 单单输入l会帮我们打印我们写的c程序的前十行代码,再输入l会自动向后打印,直至打印至末尾位置。
如图
在这里插入图片描述
 l指令也可以直接加行号,从num行开始打印。

l num

在这里插入图片描述

 l还可以直接在代码中查找某函数,然后直接打印出函数上下的几行代码。下图为C代码,我们可以看到有一个add函数和main函数。
在这里插入图片描述
 我们在gdb模式下想直接锁定main函数,就可以直接使用l指令,空格加main函数即可。
如图:
在这里插入图片描述
 如果单单只能看代码那就很low了,接下来我们对比VS stdio中调试时的操作,对gdb如何实现同样功能实现详细的讲解。
首先就是打断点操作。
 对应vs中F9就是打断点和取消断点,在gdb中对应的操作就是b加行号。
在这里插入图片描述
 命令行提示断点已经打好了,但是我们怎么知道断点是真的打好了呢?
info b指令
 info b指令就是用来查看我们所打得断点的信息。
在这里插入图片描述
 我们可以看到会给我们提供很多的断点的信息,前边序号和种类不必多说,Disp表示是否常显示,对于断点来说就是断点执行一次之后是否还有效,例如在循环中的断点,如果是keep状态下次就还会有效,如果继续调试还是会停在该断点的位置,如果状态为dis就为无效。
 Enb就是该断点的是使能开关,如果是y表示该断点继续使用,如果为n就表示该断点不生效,就会直接跳过该断点。
 后边Address表示该断点的地址,whta就是断点在哪个函数哪个位置第几行。
 上边都是粗略的解释,下边我会给大家详细演示如何使用它们或者改变他们的属性。
知道了如何创建断点,那么如何删除断点呢?
d 指令
 要注意的是,这里d后边跟的是断点的序号,而不是断点的行号。
我们来创建几个删除几个观察现象。
 创建时不会按照断点的行号进行排序,第几个打得断点就是几号。如图
在这里插入图片描述
删除断点的操作
在这里插入图片描述
 可见1号断点和3号断点成功被删除了。那么此时我们继续创建断点,序号是补上1和3呢,还是继续向后添加序号为5的断点呢?
一试便知。
在这里插入图片描述
不会对断点进行补齐,而是继续向后排列,不要记错咯。
 当然我们前边添加和删除断点的操作是在该次调试下有效的,如果q退出调试后再次进入我们之前所打的断点就都不复存在了,再次调试后序号就会从1重新开始。
 有关断点,我们还需要知道如何打开或关闭使能开关,但是就算现在说了还是不能好好演示效果,所以在此之前讲一讲gdb中对应vs中f5的操作。下边的指令都要稍微记忆一下,不然很容易忘掉。
在这里插入图片描述
点击F5调试后,会直接跳到第一个断点的位置,在gdb中就是r指令。

r:对应vs下F5,跳到下一断点处。

来使用一下,现在我们打了以下三个断点。
在这里插入图片描述

 输入r进行调试,就可以直接运行到我们打断点的位置。此时再次查看断点信息就可以看到一号断点已经被命中了一次。
在这里插入图片描述
接下来介绍另一个操作,逐过程调试,即vs下的F10。
在这里插入图片描述
 逐过程和逐语句的区别就是,逐语句会进入函数中,会走完程序的所有代码,而逐过程会把函数认定为一个过程,直接走完该函数。
 逐过程对应的就是n(next),逐语句对应的就是s(step)。
我们来看现象
在这里插入图片描述
我们第一个缎带你打在第十行,可以看出下一步就是输入a的值,然后进行判断。
在这里插入图片描述
 此时运行到if判断句,我们逐语句或者逐过程调试时,会自动打印出当前所在行。因为linux下没有图形化界面,所以只能打印出提示我们当前光标所在行。作用就和下图的小箭头一样。
在这里插入图片描述
 因为n是逐过程,所以到达调用函数的语句只会执行一步,我们来观察现象。
我们直接在调用函数的语句前打上一个断点。
在这里插入图片描述
 直接r跳转,因为前边有打印操作,直接忽略就好了。
可以看到这样一条语句
在这里插入图片描述
此时执行n命令。

在这里插入图片描述
可以看到,并没有跳转到该函数位置。
 前边所说的s是逐语句运行,所以按理说会跳转到add函数的位置,实践检验真知。
 同样将断点设置在进入函数时的语句,r直接跳转到断点处,然后使用s指令观看现象
在这里插入图片描述
上边return的语句就是我们在add函数中的语句。

在这里插入图片描述
现在已经知道基本的调试的操作了,但是在vs中还有一个十分关键的功能就是
在这里插入图片描述
在调试中,一定想要知道程序中变量的变化,所以就需要我们的监视功能。
 gdb下当然也是有这个功能的,对应的就是p加上变量名,就可以查看当前程序中该变量的值。
为了验证这个功能,新写一段代码。(编译时记得-g选项哦)。
在这里插入图片描述

直接在main函数第一条语句前打上断点,然后单步运行进行观察。
在这里插入图片描述
可以看到,我们使用p指令时,下边就会给我们显式打印a的值。
在这里插入图片描述
未执行b的初始化时,b的值为0,单步运行后即为4,可见操作是正确的。
但是对比vs下是一个悬浮窗口,而且是常显示的,我们可以一直看到。
当然,gdb也可以设置常显示。
在这里插入图片描述
每次向下执行时都会打印两个变量的大小,这就是变量的常显示。
如何取消变量的常显示呢?
 我们可以看到,每次打印常显示变量的时候,前边都有一个编号,我们就是使用undisplay加序号即可。
如何查看我们设置的常变量呢?
info display
在这里插入图片描述
将一号变量取消常显示
在这里插入图片描述
 我们在display时,也可以同时常显示多个文件,将所有变量常显示全部关闭,然后同时将三个变量常显示。但是要求这几个变量是相同类型的即可。
在这里插入图片描述
还记得前边断点的描述吗?如何不使用某个断点呢?
我们可以关闭该断点的是能开关。
在这里插入图片描述
使用的指令就是disable加序号。要和前边的display要区分开哦!
在这里插入图片描述
此时这个断点就是未启用的。
如果想继续用这个断点呢?就要启用该断点,enable指令加序号就能使使能开关设置为y。
在这里插入图片描述
调试中还有其他的操作

  • until n行号:直接跑到第n行。

在这里插入图片描述

  • finish进入某个函数时,如果想要直接走完这个函数就可以直接finish。

  • c:从这个断点直接到达下一个断点。

  • 如果在运行过程中想要修改某个变量的值,就可以使用set var指令,修改一个变量的值。
    在这里插入图片描述
     可以看出,在修改后a的值就变成了1,程序在后边的运行中a的变量都会因为这次改变而改变,从而影响程序运行的结果。
    gdb下基本的指令操作到这里就全部讲解完毕了,如果有什么错误还请指正,欢迎大家讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03.配置监控一台服务器主机

配置监控一台服务器主机 安装zabbix-agent rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm配置zabbix-agent,配置的IP地址是zabbix-server的地址,因为要监控这台主机 vim /etc/zabbix/zab…

免费开源线上线下交友社交圈子系统 小程序+APP+H5 可支持二开!

为什么要玩社交软件:互联网社交软件的独特优势 首先,社交软件为我们提供了一个便捷的沟通方式。在传统的交往方式中,人们需要面对面交流,这种方式在时间和空间上都受到限制。而社交软件打破了这些限制,无论我们身处何地…

既能自动仿写公众号爆文,还能批量帮你上架闲鱼商品,打造自己的数字员工,简直yyds

「想象一下,如果有一个机器人在你的计算机上24小时不间断地工作,会不会做梦都笑着」 一、RPA机器人是什么? RPA——机器人流程自动化,它可以帮助人们完成重复性的、繁琐的工作,比如数据输入、网页爬取、自动化流程等…

llama3 史上最强开源大模型,赶超GTP-4,逼宫OpenAI

2024年4月18日,Meta公司推出了开源大语言模型Llama系列的最新产品—Llama 3,包含了80亿参数的Llama 3 8B和700亿参数的Llama 3 70B两个版本。Meta称其为“迄今为止最强的开源大模型”。 怪兽级性能 LLaMA3 提供了不同参数规模的版本,以适应…

你真的知道Show Master Status吗?

欢迎来到我的博客,代码的世界里,每一行都是一个故事 你真的知道Show Master Status吗? 前言输出字段展示file详解Position详解Binlog_Do_DBBinlog_Ignore_DBExecuted_Gtid_Set 前言 在数据库的世界里,每一个字段都像是一个谜团&a…

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务,通过feign实现服务间接口的调用,那对于不同权限的用户访问同一个接口,我们怎么知道他是否具有访问的权…

Verilog中求两个数的差值

根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b为8bit位宽的无符号数。如果a>b,则输出a-b,如果a≤b,则输出b-a。 接口信号图如下: 代码如下: (CSDN代码块不支持Veril…

WPF之绑定属性值转换

1&#xff0c;使用Binding.Format属性简易设置绑定的属性数据显示格式。 <TextBox Grid.Row"2" Grid.Column"1"><TextBox.Text><Binding Path"UnitCost" StringFormat"{}{0:C3}" > …

加州大学欧文分校英语中级语法专项课程02:Adjectives and Adjective Clauses 学习笔记

Adjectives and Adjective Clauses course certificate 本文是 https://www.coursera.org/learn/adjective-clauses 这门课的学习笔记。 文章目录 Adjectives and Adjective ClausesWeek 01: Adjectives and Adjective PhrasesLearning Objectives Adjectives Introduction Le…

一个新细节,Go 1.17 将允许切片转换为数组指针!

在 Go 语言中&#xff0c;一个切片&#xff08;slice&#xff09;包含了对其支持数组的引用&#xff0c;无论这个数组是作为一个独立的变量存在于某个地方&#xff0c;还是仅仅是一个为支持分片而分配的匿名数组。 其切片基本结构都如下&#xff1a; // runtime/slice.go typ…

ChatGPT 4.0 直接用 !!!Code Copilot编程大模型、DALL-E AI绘图、绘制流程图、上传文件

嗨&#xff0c;你好呀&#xff0c;我是哪吒。 这一年最让人揪心的热点&#xff0c;就是各种层出不穷的AI技术。 原以为它只是短暂霸屏&#xff0c;但现实却赤裸裸展示了&#xff0c;什么叫AI抢走你的饭碗&#xff0c;连招呼都不打一声! 什么策划方案、公众号文案、营销卖点、…

学术咸鱼入门指南(1)

学术基础素养 一.巧用工具管理文献&#xff0c;形成自己的文献体系 养成习惯的第一步&#xff1a;文献命名 当你下载完一篇文献&#xff0c;应该做的第一步就是给文献重新命名。命名的逻辑可以随自己的喜好来&#xff0c;可以按照“发表年份作者文章标题”。 也可以使用文献…

利用策略模式+模板方法实现项目中运维功能

前段时间项目中有个需求&#xff1a;实现某业务的运维功能&#xff0c;主要是对10张数据库表的增删改查&#xff0c;没有复杂的业务逻辑&#xff0c;只是满足运维人员的基本需要&#xff0c;方便他们快速分析定位问题。这里简单记录分享下实现方案&#xff0c;仅供参考。 一、…

多模态路径:利用其他模态的无关数据改进变压器(CVPR 2024)

<Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities> 论文地址&#xff1a;https://arxiv.org/abs/2401.14405 项目网页&#xff1a;https://ailab-cvc.github.io/M2PT/ 开源代码&#xff1a;https://github.com/AILab-CVC/M2PT 讲…

vue快速入门(五十七) 作用域插槽

注释很详细&#xff0c;直接上代码 上一篇 新增内容 作用域插槽实现表格删除数据 源码 App.vue <template><div id"app"><!-- 向子组件传值 --><MyTable :tableData"tableData"><!-- 接收子组件的传值&#xff0c;默认是对象格…

Web3 ETF的基本概念

Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;是一种投资工具&#xff0c;它允许投资者通过购买单一的基金份额来获得对多个与Web3技术相关的公司和资产的曝光。Web3技术通常指的是基于区块链构建的去中心化网络和应用&#xff0c;包括加密…

时间复杂度空间复杂度 力扣:转轮数组,消失的数字

1. 算法效率 如何衡量一个算法的好坏&#xff1f;一般是从时间和空间的维度来讨论复杂度&#xff0c;但是现在由于计算机行业发展迅速&#xff0c;所以现在并不怎么在乎空间复杂度了下面例子中&#xff0c;斐波那契看上去很简洁&#xff0c;但是复杂度未必如此 long long Fib…

【深度学习实战(31)】模型结构之CSPDarknet

文章目录 一、CSPDarknet整体结构二、CSPNet结构2.1 里面小残差结构Bottleneck2.2 外层大残差结构CSP 三、SPP结构四、CSPDarknet结构4.1 stem结构4.2 dark2,3,4结构&#xff0c;dark3为例&#xff1a;4.3 dark5结构4.4 CSPDarkNet整体结构 四、完整代码 一、CSPDarknet整体结构…

通过DataGrip将mysql表结构信息转存excel 复制select结果的insert插入语句

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展&#xff0c;在这个系列专栏中记录了博主在学习期间总结的大块知识点&#xff0c;以及日常工作中遇到的各种技术点 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 查询表结构信息&#xff0c;并…

[安洵杯 2019]JustBase(替换表)

题目&#xff1a; 我们看到题目是一些杂乱的字母和符号&#xff0c;但从题目和末尾的两个号&#xff0c;我们猜测是base64加密&#xff0c;但题目未出现1-9数字&#xff0c;而base64不包含!#$%等字符&#xff0c;所以我们考虑将字符!#$%按照键盘替换成数字1-9. 替换代码如下&a…