【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
目录
背景知识
编译器gcc/g++的安装
编译器gcc/g++的使用
调试器gdb的使用
cgdb
条件断点
背景知识
子曰:“温故而知新”。在谈gcc/g++的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。

编译器gcc/g++的安装
在CentOS下,安装的指令为 sudo yum install -y gcc。
在Ubuntu下,安装的指令为 sudo apt install -y gcc。
编译器gcc/g++的使用
gcc和g++的使用方法很类似,因为它们的选项基本一样。
● -E,在预处理结束后停止编译过程。
● -S,编译完成就停下。
● -c,汇编完成就停下。
● -g,生成调试信息。
编译器优化选项的4个级别:
● -O0
● -O1
● -O2
● -O3
其中,-O0表示没有优化,-O1为缺省值,-O3的优化级别最高。
其他选项:
● -w,不生成任何警告信息。
● -Wall,生成所有警告信息。
下面,我们来练练手。
1)将test.c进行预处理,生成test.i文件。

我们打开test.i瞅一眼。

2)将test.i进行编译生成test.s文件。

我们打开test.s看看。

可以看到,已经变成汇编指令了。
3)将test.s进行汇编生成test.c文件。

当我们在打开test.o时,会发现我们已经看不懂了,汇编指令已经被转换成机器可识别的二进制代码。

4)-g选项有无的对比

我们可以看到,加了-g选项生成的_g_test文件要比没加-g选项生成的test文件要大,这是因为_g_test文件里包含了调试信息,而test中没有包含。
调试器gdb的使用
程序的发布方式有两种,debug模式和release模式,gcc/g++直接编译出来的二进制程序,默认是release模式。如果我们要使用gdb调试,就必须在编译的时候加上-g选项。至于-g选项怎么加,上面已经演示过了。下面我们正式进入gdb的使用。

指令:gdb code / /打开code进行调试

● ctrl + d 或 quit,退出调试。
● list 或 l 行号,以所指定行号为中心显示源代码,一次10行。

● list 或 l 函数名,列出指定函数的源代码。

● run 或 r,运行程序。

● n 或 next,逐过程调试(不会进入函数内部)。
● s 或step,逐语句调试(会进入函数内部)。
● b 或 break 行号,在指定行设置断点。
● break 函数名,在指定函数开头设置断点。
● info break,查看断点信息。
● finish,执行当前函数,然后停下。

● p 变量,打印变量的值。

● set var,修改变量的值。
● c 或continue,从当前位置开始运行。

● delete breakpoints,删除所有断点。
● d n,删除序号为n的断点。
● delete breakpoints,删除所有断点。
● disable breakpoints,禁用所有断点。
● disable breakpoint n,禁用n号断点。
● enable breakpoints,启用所有断点。
● enable breakpoint n,启用n号断点。
● info b,查看所有断点信息。

● until 行号,跳到指定行。
● display 变量名,跟踪查看一个变量,每次停下来都显示它的值。
● undisplay,取消对先前设置的变量的跟踪。 
cgdb
cgdb是gdb的一个图形界面版本,它具有gdb的所有功能,相较于gdb,cgdb便于我们查看源代码。
CentOS下,安装指令 sudo yum install -y cgdb。
Ubuntu下,安装指令 sudo apt install -y cgdb。
用法:cgdb 文件,例如,cgdb code。

条件断点
通过前面的学习,我们已经掌握了如何打断点,现在我们来学习如何打条件断点。
关键字:condition
语法:condition 断点编号 条件
下面举个简单的例子。

上述设置的条件断点的意思是:如果a等于20就停下来,否则不停下。我们可以看到,在运行起来后,程序停在了第12行,也就是说跳过了第一个断点,因为a不等于20,导致条件断点没生效。
本文到这就结束啦~如有错误,请您不吝指出!
相关文章:
【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
目录 背景知识 编译器gcc/g的安装 编译器gcc/g的使用 调试器gdb的使用 cgdb 条件断点 背景知识 子曰:“温故而知新”。在谈gcc/g的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。 编译…...
自动化流程机器人(RPA)
自动化流程机器人(RPA)正逐渐成为企业提高效率和降低成本的强有力工具。 一、RPA的概念 自动化流程机器人(Robotic Process Automation,简称RPA)是一种利用软件机器人(Robot)模拟和执行复杂任务…...
Unity persistentDataPath使用案例
Unity persistentDataPath使用案例 一、Application.persistentDataPath 1、概念 persistentDataPath:此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件;是一个可读写的目录;此文件夹在Edi…...
Android 测试手册
1. 介绍 Android 测试是确保应用程序质量的重要步骤。它包括不同类型的测试,用于验证应用程序的功能、性能、安全性和用户体验。这个手册将指导你了解和实施 Android 测试的主要方法和工具。 2. 测试类型 2.1 单元测试 目的:验证单个组件(…...
各大平台统遭入侵??区块链市场遭攻击损失近3亿!
今年,全球发生多起骇人听闻的勒索入侵软件攻击事件,黑客组织利用各种手段和技术,不断试图突破网络安全防线,窃取敏感信息、破坏系统运行,甚至进行勒索和敲诈,使得网络安全问题日益凸显其重要性和紧迫性。 S…...
Java泛型(“代码模板”,一套代码套用各种类型)
1.什么是泛型 a.定义 i.如果不用泛型定义,在使用ArrayList时需要为每个class编写特定类型代码。 ii.泛型就是定义一种模板,既实现了编写一次,万能匹配,又通过编译器保证了类型安全。 iii.编写模板代码来适应任意…...
速响低代码平台:升级营销管理系统,开启高效无忧新体验!
当前日新月异的商业环境,企业面临着前所未有的挑战与机遇。随着市场竞争的日益加剧和企业业务的不断拓展,传统的营销方式和管理手段逐渐显露出其局限性,难以适应快速变化的市场需求。 数据收集难:传统的营销管理缺乏对客户数据的收…...
Gitlab升级14.0.12-->14.3.6遇到的gitlab-ctl reconfigure错误
问题描述 在按照官方文档升级路线11.0.2>17.2.2的过程中,升级14.0.12–》14.3.6时遇到一个错误: Running handlers: There was an error running gitlab-ctl reconfigure:rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had…...
JDBC导图
思维歹徒 一、使用步骤 二、SQL注入 三、数据库查询(查询) 四、数据库写入(增删改) 五、Date日期对象处理 六、连接池使用 创建连接是从连接池拿,释放连接是放回连接池 七、事务和批次插入 八、Apache Commons DBUtil…...
飞思实验室与中飞院联合开发教学课程,校企联袂共绘教育蓝图
近日,飞思实验室与中国民用航空飞行学院(以下简称“中飞院”) 航空电子电气学院合作,共同开发《无人智能视觉导航控制技术》、《多旋翼无人飞行器集群系统》实验课程。这一举措旨在深化校企融合,学校通过引入企业带来的…...
Telephony Call
1、Telephony 架构 Telephony整体架构和Android架构一样的,包括APP层,框架层,HAL层,内核层。 其中HAL层不同平台实现方式不同,其中MTK SPRD 平台使用AT通道的方式实现,高通使用QMI方式实现。 2、通话业务介绍 APP包括Dialer.apk、TeleService.apk、Tele…...
Python--TCP/UDP通信
文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求,并与之建立连接,然后接收和发送数据。 创建套接字:首先࿰…...
【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决
1. xxl-job 报错日志 2024-09-11 17:19:04 [com.xxl.job.core.thread.JobThread#run]-[133]-[xxl-job, JobThread-3-1726046344528] <br>----------- xxl-job job execute start -----------<br>----------- Param: 2024-09-11 17:19:04 [com.xxl.job.core.thread…...
Redis——常用数据类型string
目录 常用数据结构(类型)Redis单线程模型Reids为啥效率这么高?速度这么快?(参照于其他数据库) stringsetgetMSET 和 MGETSETNX,SETEX,PSETEXincr,incrby,decr…...
架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
本文首发在这里 重中之重就是想实现无锁!无锁!无锁! 源码 servergolang 预计还会实现gate_server,接受并保持websocket长连接,按需双向流到game_server进行消息转发 未来上述服务均会以容器的形式由k8s自动化部署、…...
个人随想-gpt-o1大模型中推理链的一个落地实现
首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1还有它的mini版。官网的介绍,就是它的推理能力很强,比gpt-4o有很大的提升。 最近也跟同行在聊这个o1,看看落地方面有哪些可行性。在我们自己的实验上,把o1用…...
python解析ip范围,判断ip是否在ip范围内
目录 1. 背景 2. 代码使用示例 2.1 分割ip,横杠 (-) 的ip范围 2.2 判断ip在掩码(/)的范围内 2.3 判断ip在横杠(-)的范围内 2.3.1 格式:192.168.1.1-192.168.1.10 2.3.2 格式&…...
Springboot错误日志切面,找到post请求体被消费后的数据
问题记录:测试环境接口报错,日志里没有请求参数等信息,于是写了一个切面,但切面中获取不到 request的请求体,因为 post 请求体只能被消费一次,于是找解决办法 解决方法 既然 request 被消费了导致对应的请…...
【二十】【QT开发应用】listwidget右键菜单和删除item
创建项目,添加资源文件 在项目文件夹中创建resources资源文件夹。 在vs中打开qrc文件,选择添加资源文件。 选择我们resources资源文件中的所有文件作为资源文件。 最后不要忘记点击保存。 向ListWidget控件添加item 右键菜单 在.h文件中添加QMenu头…...
LabVIEW机动车动态制动性能校准系统
机动车动态制动性能测试系统通过高精度的硬件设备与LabVIEW软件的紧密配合,实现了对机动车制动性能的精确校准与评估。系统不仅提高了测试的精确性和效率,而且具备良好的用户交互界面,使得操作更加简便、直观。 项目背景 随着机动车辆数量的…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...
初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...
