【Linux】gcc/g++/gdb的使用
🔥🔥 欢迎来到小林的博客!!
🛰️博客主页:✈️小林爱敲代码
🛰️社区 : 进步学堂
🛰️欢迎关注:👍点赞🙌收藏✍️留言
文章目录
- 💖gcc/g++的使用
- gcc/g++的使用
- 静态库和动态库
- gcc的一些操作选项
- 💖gdb调试器的使用
- gdb的安装及使用
- gdb的常用指令
- 总结🥳:
💖gcc/g++的使用
gcc/g++的使用
gcc/g++是一个Linux编译器,gcc是用来编译c语言的,而g++是用来编译c++的,所以这2个编译器的使用方法是一样的。我们这里只讲解gcc,把一个C语言文件生成可执行程序要经历四个阶段
1. 预处理
- 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
- 预处理指令是以#号开头的代码行。 实例: gcc –E mytest.c –o mytest.i
- 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
- 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
以下是在Linux上的演示。首先我新建了一个 mytest.c的文件并编辑了一段代码。
现在我们执行命令 gcc -E mytest.c -o mytest.i
``
我们会发现生成了一个mytest.i文件,然后我们用vim打开这个文件看看。
我们可以看到,之前打的注释没了,宏定义Num也替换了,并且头文件stdio.h在最上面展开。所以预处理功能主要包括宏定义,头文件展开,条件编译,去注释等。
2. 编译
- 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
- 例子: gcc –S mytest.i –o mytest.s
案例演示
我们还是用上面弄出来的mytest.i文件。 输入命令 gcc -S mytest.i -o mytest.s
然后就可以看到生成了一个mytest.s的文件,然后我们用vim打开它看看里面是什么内容。
我们可以看到,mytest.s文件里面都是汇编代码,这也就意味着 .s文件存的是C语言代码被转换成汇编时对应的汇编代码。
3.汇编
- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
- 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
- 实例: gcc –c hello.s –o hello.o
那么我们继续用上面的 mytest.s文件来演示。
我们输入 gcc -c mytest.s -o mytest.o
我们就可以看到生成了mytest.o文件,那我们也打开它看看它长什么样。
我们可以看到它全是一些乱码,这就意味着这个文件是一个二进制文件。也就是说汇编这个过程 是把汇编代码转换成二进制的机器码。
4.链接
- 在成功编译之后,就进入了链接阶段。
- 比如: gcc mytest.o –o mytest
然后我们发现我们有一个mytest的可执行文件。我们可以直接运行。
我们可以看到打印了10000,不过没有换行,所以挤在了一起。
当然,gcc mytest.c -o mytest 也是可以的。
静态库和动态库
静态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”
动态库
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证
gcc的一些操作选项
如下表所示:
选项 | 说明 |
---|---|
-E | 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 |
-S | 编译到汇编语言不进行汇编和链接 |
-c | 编译到目标代码 |
-o | 文件输出到 文件 |
-static | 此选项对生成的文件采用静态链接 |
-g | 生成调试信息。GNU 调试器可利用该信息。 |
-shared | 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库. |
-O0 | |
-O1 | |
-O2 | |
-O3 | 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 |
-w | 不生成任何警告信息。 |
-Wall | 生成所有警告信息。 |
💖gdb调试器的使用
- 程序的发布方式有两种,debug模式和release模式
- Linux gcc/g++出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
gdb的安装及使用
而进入调试界面的方式是 gdb + 可执行程序名。
再此之前我们得有一个程序。下面是我们在test.c文件里面写的一个程序。
#include<stdio.h>int TopSum(int max)
{int sum = 0;for(int i = 1; i <= max ; i++ ){sum += i;}return sum;
}int main()
{int i = 100;int ret = TopSum(i);printf("%d\n",ret);return 0;
}
然后我们编译它,我们必须在编译的时候加上 -g选项,因为默认选项是release版本的。release版本是不支持调试的,只有加上 -g选项后才能让生成的可执行程序是debug版本。所以我们可以输入命令 gcc test.c -o test -g
而编译的时候提示报错,这是因为 for(int i …)在for循环里面定义变量只有在C99版本才能支持。所以我们把命令换成 gcc test.c -o test -g -std=c99 即可
这样就可以了,然后我们 gdb test即可进入调试界面。
如果出现这种信息,是因为你还没有安装gbd,那么可以用root用户去安装一下。
安装命令:yum install gdb
成功进入调试界面是这样的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gd0kwEPE-1677680336801)(C:\Users\王有林\AppData\Roaming\Typora\typora-user-images\image-20230204153230111.png)]
然后我们可以通过各种各样的指令来调试。
gdb的常用指令
那我们来演示几个最基本的命令
list/l 10 显示第10行的代码
run /r 运行程序
break/b 17 在第17行打上断点
info break/b 查看断点信息
n 单条执行
因为断点打在17行,所以17行执行完就到第18行了。
s/step 进入函数调用
进入到了函数的第一行,就是成功进入函数调用了。
delete breakpoints n 删除编号为n的断点
在删除之前,我们要先知道断点的编号。所以我们要先info b来查看断点信息。
Num这一列对应的就是断点编号,我们可以看到17行的断点编号为1,所以我们可以执行命令delete breakpoints 1来删除断点。
删除后我们再调用info b来查看断点信息,发现没有断点了,这就说明我们删除断点成功。
当然,gdb工具的使用命令还有很多,在下面已经为大家列好了一张命令操作表
选项 | 说明 |
---|---|
list/l 行号 | 显示binFile源代码,接着上次的位置往下列,每次列10行。 |
list/l 函数名 | 列出某个函数的源代码。 |
r或run | 运行程序。 |
n 或 next | 单条执行。 |
s或step | 进入函数调用 |
break(b) 行号 | 在某一行设置断点 |
break 函数名 | 在某个函数开头设置断点 |
info break | 查看断点信息。 |
finish | 执行到当前函数返回,然后挺下来等待命令 |
print( p ) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
p 变量 | 打印变量值。 |
set var | 修改变量的值 |
continue(或c) | 从当前位置开始连续而非单步执行程序 |
run(或r) | 从开始连续而非单步执行程序 |
delete breakpoints | 删除所有断点 |
delete breakpoints n | 删除序号为n的断点 |
disable breakpoints | 禁用断点 |
enable breakpoints | 启用断点 |
info(或i) breakpoints | 参看当前设置了哪些断点 |
display 变量名 | 跟踪查看一个变量,每次停下来都显示它的值 |
undisplay | 取消对先前设置的那些变量的跟踪 |
until X行号 | 跳至X行 |
breaktrace(或bt) | 查看各级函数调用及参数 |
info(i) locals | 查看当前栈帧局部变量的值 |
quit | 退出gdb |
总结🥳:
💦💦如果有写的有什么不好的地方,希望大家指证出来,我会不断的改正自己的错误。💯💯如果感觉写的还可以,可以点赞三连一波哦~🍸🍸后续会持续为大家更新
🔥🔥你们的支持是我最大的动力,希望在往后的日子里,我们大家一起进步!!!🔥🔥
相关文章:

【Linux】gcc/g++/gdb的使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️社区 : 进步学堂 🛰️欢迎关注:👍点赞🙌收…...

浅浅谈一谈B树和B+树
目录: 🚀1.B树 🚀2.B树 索引背后的数据结构是啥呢,是B树,是为了数据库索引设计的,我们可以先了解B树,再说B树 1.什么是B树 B树也叫B-树,这里的-不读减,是一个符号 我们已经学过了二叉搜素树,B树其实就是N叉搜素树,二叉搜索树只能在每一个结点放一个…...

Keil新建一个国民32位MCU工程
1.打开Keil软件,点击Project→New uVision→Project 2.将工程保存到自己的工程文件夹,并给项目命名,点击保存 3.选择自己需要开发的芯片,点击OK 4.点击OK 5.出现上图所示,工程已经建好了,点击配置工程。 6.…...

webpack.config.js与package.json文件的配置
path要使用绝对路径,通过每次复制文件位置非常麻烦且容易导致问题 使用node中的 写个包名跟入口名称,其他全部回车 此步完成后,自动生成一个package.json包 licence指的是开源,一般不写 安装文件夹需要的依赖 dirname是node自带…...

超详细Eclipse配置JDK
在此附上Eclipse安装教程 超详细Eclipse安装教程 在此附上JDK1.8安装配置教程 超详细JDK1.8安装与配置 ①打开Eclipse–>点击Window–>点击Preferences ②找到Java–>找到Installed JREs–>点击Add… ③选中Standard VM–>之后点击Next ④点击Directory找…...
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares 目录 解决问题 解决思路 解决方法—四大原因分析 T1、数据本身问题的解决方法...

Allegro如何设置铜皮避让的优先级操作指导
Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…...

(Trie Tree)字典树
(Trie Tree)字典树 场景:在n个字符串中查找某个字符串。 暴力匹配,时间复杂度为O(nm),m为字符串平均长度,效率过低。 字典查找单词"fly",首先查找’f’,然后…...

MQTT的学习之Mosquitto集群搭建
文章钢要: 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。 首…...
TS面向对象
第二章:面向对象 面向对象简而言之就是程序之中所有的操作都需要通过对象来完成。 举例来说: 操作浏览器要使用window对象操作网页要使用document对象操作控制台要使用console对象 一切操作都要通过对象,也就是所谓的面向对象,…...

Python进阶-----高阶函数map() 简介和使用
目录 简介: 编辑 示例: 示例(1):输出map()函数返回值(迭代器)结果 示例(2):与循环对比 示例(3):字符串转列表 示…...
GPU会变得更便宜吗?GPU 定价更新
在英伟达和AMD发布了一段时间的一致显卡之后,事情在二月份已经降温。没有新的GPU可以谈论,没有特别惊人的交易或任何东西,但仍然值得看看市场现在的表现如何,因为它已经稳定下来,以及我们在未来几个月可以期待什么。过…...

IDEA如何创建一个springboot项目
要想进入springboot的殿堂,你的跨进springboot的门槛,下面就是使用IDEA初始话一个简单的springboot项目。 选择Create New Project 选择Spring Initializer——>选择对应的jdk版本——>Default默认在线构建,需要联网噢 选择自己想写…...

Netty核心功能以及线程模型
目录 Netty核心功能以及线程模型 Netty初探 Netty的使用场景: Netty通讯示例 Netty线程模型 Netty模块组件 Netty核心功能以及线程模型 Netty初探 NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 So…...
【并发编程二十】协程(coroutine)_协程库
【并发编程二十】协程(coroutine)一、线程的缺点二、协程三、优点四、个人理解五、协程库1、window系统2、unix系统(包括linux的各个版本)2.1、makecontext2.2、swapcontext2.3、setcontext3、第三方库3.1、Boost.Coroutine23.2、…...

c语言入门-5-字符串
c语言入门-5-字符串正文1、字符串怎么用方式一方式二2、字符串的长度深度解析1 字符串的特性2 \0 的含义3 ascii码表下一篇正文 1、字符串怎么用 方式一 // 字符串的标准使用方式,用char类型的数组表示字符串 #include<stdio.h> int main() {char arr[] &…...
[Ansible系列]ansible roles
目录 一. Roles简介 二. Roles基本构成 三. Role使用 3.1 playbook中引用roles 3.2 pre_tasks 和 post_tasks 3.3 role的依赖 四. Ansible Galaxy 一. Roles简介 在Ansible中,role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook…...

冯诺依曼体系结构与操作系统的理解
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:操作系统 💬<3>前言:今天来介绍一下冯诺依曼体系结构,和操作系统的理解。 目录 1.冯诺依曼体系结构 冯诺依曼体系的工作原理: 为…...
API接口签名验证
文章目录一、使用背景二、实现方案三、具体流程四、优化五、代码实现六、后续优化一、使用背景 过去对于接口的验证我一般都是直接在登录时为用户发放token,用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题,如果token被…...

Keettle (pdi-ce) 整库多表迁移(避坑)
使用开源免费 Keettle 工具 1.下载与安装 官网地址:下载 下载9.3.0以上的,6.1、7.1我都尝试过,6.1导致很多莫名其妙问题,7.1数据库可以连接和预览,迁移的时候就会出现事务读问题,最后解决这个问题后&…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...