Linux关于 gdb 调试器的使用

news2024/11/25 22:41:35

坚持看完,结尾有思维导图总结

这里写目录标题

  • debug 和 release 版本
  • gdb 常见命令
    • 断点
    • 逐行调试和观察变量
  • 总结

debug 和 release 版本

首先要说的是 ,在 Linux 中 gcc 直接编译是不能进行调试的
而是要在加上 -g 选项才能得到可调试的文件
以下程序用一个例子来讲解

在这里插入图片描述
c 语言文件就一个 printf
在这里插入图片描述

Makefile 文件中就是两个编译
一个编译是 debug 和 release 版本(单词写错了)

然后进行编译后得到两个文件
在这里插入图片描述

可以使用 readelf 的命令看看 二进制文件,二进制文件以 elf 的格式保存起来
我们可以看看里面的debug 信息
在这里插入图片描述
使用的是命令
readelf -S debug |grep -i debug
关于 debug 版本的调试信息

gdb 常见命令

gdb 是Linux中使用的调试的工具
就和vs 中进入调试状态是相似的

断点

调试最重要的一个操作是打断点和看断点

l 这个后面可以跟行数 n 或函数 x,能够列出的 n 行开始的源程序和 函数 x 的 源程序,用来看代码
在这里插入图片描述
break + 行号 /函数 在对应的行号或者函数打上断点
info break 可以看到 断点的信息
在这里插入图片描述
delete breakpoints 断点号码 可以删除标号 NUM 为 n 的断点
在这里插入图片描述
delete breakpoints 可以删除所有断点

利用 enable 和 disable 可以保留断点痕迹 但是禁用或者使用断点
在这里插入图片描述
原来断点 Enb 都是 y
disable breakpoints n 可以禁用断点 n
在这里插入图片描述
enable breakpoints n 可以使能断点 n
执行后发现 Enb 再次变成了 y
在这里插入图片描述
r 是运行到断点处的命令
当没有断点的时候就执行完
在这里插入图片描述
有断点的时候就会
在这里插入图片描述
阐述了到达对应的断点处并且显示原码
到这里,关于断点的知识就讲完了

逐行调试和观察变量

因为前面的程序没有什么变量和循环,所以这里写一个阶乘和相加的循环来进行另一个说明
现在的例子变成了这个程序,可以看到 阶乘中有循环,也有函数
在这里插入图片描述

如果我在第 20 行打断点,然后 r (运行),就会停止在 断点处
在这里插入图片描述
然后我们有两个参数 add 和 stepret
利用 display + 变量 就能够随时查看变量 需要 r 了之后才能 display
在这里插入图片描述
利用 n 能够逐过程进行(不进入函数),向下运行两次,得到两个变量的变化
在这里插入图片描述
利用 s 可以进入函数看函数的运行(逐语句运行)
重新运行后,走到断点的位置(阶乘位置),s 进入函数,不断回车可以看到 循环在不断进行
我把 ret 和 i 都display 出来,能够看到在不断循环

在这里插入图片描述

如果觉得循环太烦,用 until x 直接运行到 x 行
就能够直接运行到循环跳出
在这里插入图片描述
或者可以使用 finish 运行完这个函数
可以看到 运行完后由返回到进入的位置
并且记录和函数的 return 值是 $1 = 6
在这里插入图片描述
最后 q 退出 gdb

总结

在这里插入图片描述

希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

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

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

相关文章

算法第十二期——BFS-双向广搜

双向广搜 应用场景:有确定的起点s和终点t;把从起点到终点的单向搜索,变换为分别从起点出发和从终点出发的“相遇”问题。操作:从起点s(正向搜索)和终点t(逆向搜索)同时开始搜索,当两个搜索产生…

Spring入门-Spring事务管理

文章目录1,Spring事务管理1.1 Spring事务简介1.1.1 相关概念介绍1.1.2 转账案例-需求分析1.1.3 转账案例-环境搭建步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步…

数据治理与档案信息资源体系建设

如果要评选大数据或者数字化转型领域中哪个词最让人费解、最讲不清楚,“数据治理(Data Governance)”绝对是候选之一。说实话,笔者到现在也没有完全整明白,因为数据治理包含的范围太广了,可以说是包罗万象&…

高潜人才的自我要求

前言,上次写了个《潜力出众的你有这样的特质吗?》,地址如下:点我查看,这次在写个高潜人才的自我要求。本次以6个纬度来进行分析;3是基本要求,4是追求卓越,看你目前做到了哪个级别&am…

跨平台API对接(Python)的使用

Jenkins 是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于 Hudson(Hudson 是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。后端可以利用 Jenkins 对任务进行调度运行:后端可利用 HTT…

【进阶】Spring更简单的读取和存储对象

努力经营当下,直至未来明朗! 文章目录一、存储Bean对象一)前置工作:配置扫描路径(重要)二)添加注解存储Bean对象3. 五大类注解:4. 方法注解:6. 相关问题7. 补充【结论、查…

ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2

0.1ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS21.1ROS2机器人编程简述humble-第一章-Introduction2.1ROS2机器人编程简述humble-第二章-First Steps with ROS2 .12.2主要内容是全手工创建一个最简单的自定义节点,其实没啥具…

IB学生必看的时间表(二)

上期谈到在IB预科课程的第一个学年下学期,便要开始作报读大学的准备,到底为什么? 暑假不容松懈 现在来到放暑假了。虽说不用上课,学生没有了学习压力,但就以下三方面来看,学生还是要继续投放心力。 首先&am…

Unity 之 Addressable可寻址系统 -- 代码加载介绍 -- 进阶(一)

Unity 之 可寻址系统 -- 代码加载介绍 -- 进阶(一)一,可寻址系统代码加载1.1 回调形式1.2 异步等待1.3 面板赋值1.4 同步加载二,可寻址系统分标签加载2.1 场景搭建2.2 代码示例2.3 效果展示三,代码加载可寻址的解释概述…

Cadence OrCAD: 跨页符和电源符号命名优先级的一个小问题

Cadence OrCAD: 跨页符和电源符号命名优先级的一个小问题 遇到的问题 最近项目中,有个电源需要做负载端的反馈,类似下图的signal1和signal1N,反馈使用类似伪差分线,把电压信号和负载端的GND都连到DC-DC控制器。DC-DC对应的反馈引…

字节跳动青训营--前端day1

文章目录前言一、 前端1 前端的技术栈2. 前端的边界3. 前端的关注点二、 HTML1. HTML常用标签及语义化2. HTML 语法3. 谁在使用我们写的HTML前言 仅以此文章记录学习历程 一、 前端 解决GUI人机交互问题 1 前端的技术栈 2. 前端的边界 nodejs–服务器端应用 electron… --客…

【数据结构】6.1 图的基本概念和术语

文章目录前言6.1 图的定义和术语前言 图是一种比线性表和树更为复杂的数据结构。 在线性结构中,结点之间的关系属于一个对一个;数据元素之间有着线性关系,每个数据元素只有一个直接前趋和一个直接后继, 在树形结构中,…

算法设计与分析课程

算法的由来 算法的定义 算法的定义:给定计算问题,算法是一系列良定义的计算步骤,逐一执行计算步骤可得到预期的输出。 良定义:定义明确无歧义 计算步骤:计算机可以实现的指令 有了良定义的计算步骤,计算机就…

Java基础篇01-运算符的使用

01| Java中的数据类型 ) 1. 数值型: 序号类型空间占用说明最小值最大值默认值优缺点对比举例1byte8位有符号整数-128(-2^7)127 (2^7-1)0byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一by…

6、Denoising Diffusion Probabilistic Models(扩散模型)

简介 主页:https://hojonathanho.github.io/diffusion/ 扩散模型 (diffusion models)是深度生成模型中新的SOTA。 扩散模型在图片生成任务中超越了原SOTA:GAN,并且在诸多应用领域都有出色的表现,如计算机…

【docker概念和实践 1】 基本概念和组成原理

一、说明 初学Docker就一个字:乱!这是因为Docker是一个庞大体系,初学时不了解全貌,处于“盲人摸象”状态,因不能通晓要领,学了一点,过后就忘了。而了解Docker全貌并非易事,官方文档也…

前端学习记录-Javascript

pink JS基础语法JavaScript核心教程阮一峰JS基础 JS基础语法 初识JS JS三种书写位置:行内、内嵌、引入式。单行注释 ctrl/ 多行注释 shift alt a输入输出语句 声明变量 var age;变量命名规范:字母、数字、下划线、美元符号组成,区分大小写…

质量体系搭建

测试团队的发展历程 初期阶段 特点:提供“保姆式”服务,以发现BUG为主要任务。 工作主要:以功能测试、兼容行测试为主的手工测试,每天进行大量的、重复性的工作,即便如此依然会有遗漏。刚起步的测试团队基本处于这个阶…

LeetCode分类刷题----哈希表篇

哈希表哈希表1.有效的字母异位词242.有效的字母异位词383.赎金信49.字母异位词分组438.找到字符串中所有字母异位词2.两个数组的交集349.两个数组的交集350.两个数组的交集||3.快乐数202202.快乐数4.两数之和1.两数之和5.四数相加454.四数相加||6.三数之和15.三数之和7.四数之和…

ARM 实时时钟 RTC

一、何为实时时钟 (1) real time clock,真实时间,就是所谓的xx年x月x日x时x分x秒星期x. (2) RTC是 SoC 中一个内部外设,RTC 有自己独立的晶振提供 RTC 时钟源(32.768KHz),内部有一些寄存器用来记录时间&am…