gcc编译器和gdb调试工具

news2024/11/18 13:29:19

gcc编译器

GCC(GNU Compiler Collection)是一套由GNU计划开发的自由软件编译器集合,它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等。GCC 是一个功能强大、稳定可靠的编译器,被广泛应用于各种操作系统和平台上。

gcc编译器具有以下特点:

  1. 多语言支持:GCC提供了对多种编程语言的支持,包括C、C++、Objective-C、Fortran、Ada、Go等。每个语言都有对应的编译器前端,将源代码翻译为GCC内部的中间表示形式。
  2. 平台支持:GCC可以运行在多种操作系统和平台上,包括Linux、Windows、macOS、FreeBSD等。它可以为不同的架构生成目标代码,例如x86、ARM、PowerPC等。
  3. 优化能力:GCC具有强大的代码优化功能,能够对生成的目标代码进行各种优化,以提高程序的性能和效率。它支持多种优化级别和优化选项,开发人员可以根据需求选择合适的优化设置。
  4. 标准符合性:GCC致力于遵循各个编程语言的标准规范,并不断更新和改进以提高对最新语言标准的支持。它严格遵循C、C++等语言的标准,并提供了一些扩展功能以满足特定需求。
  5. 可移植性:GCC的源代码是开放的,可以在不同的平台上编译和安装。这使得开发人员可以根据需要进行修改和定制,以适应特定环境和要求。GCC的可移植性也促进了各种开源项目和工具链的开发。
  6. 插件架构:GCC提供了一个插件架构,允许开发人员编写和加载各种插件来扩展和增强编译器的功能。这使得用户可以根据需要添加新的分析、优化或转换功能。

gcc的使用格式

gcc [options] [filenames]

gcc的编译过程:

image-20231018154037161

C语言的编译分为四个阶段:预处理、编译、汇编、链接。

  1. 预处理阶段:

预处理器会对源代码进行预处理,将包含在头文件中的内容插入到程序中,根据宏定义展开宏,删除注释等。这一阶段生成的文件称为预处理文件,后缀为“.i”。

  1. 编译阶段:

编译器会将预处理阶段得到的文件进行编译,生成汇编代码。编译的主要任务是将高级语言翻译成汇编语言,如变量、函数、语句等。这一阶段生成的文件称为汇编文件,后缀为“.s”。

  1. 汇编阶段:

汇编器将汇编代码转换成机器码,并生成目标文件。每条汇编指令都被转换为一个或多个机器码指令,也就是二进制表示的指令序列。这一阶段生成的文件称为目标文件,后缀为“.o”。

  1. 链接阶段:

链接器将不同的目标文件整合成一个可执行文件。在这个阶段,链接器还会检查目标文件中引用的函数和变量是否已经定义,如果没有,就会报错。这一阶段生成的文件就是我们可以执行的可执行文件,没有后缀名。

预处理

预处理器会对源代码进行预处理,将包含在头文件中的内容插入到程序中,根据宏定义展开宏,删除注释等。这一阶段生成的文件称为预处理文件,后缀为“.i”。

选项说明
-E只对文件进行预处理,不进行编译,生成的结果送标准输出
-o file将输出写到指定的文件file中
-I dir指定头文件的路径dir,先在指定路径中搜索要包含的头文件,若找不到,则在标准路径中搜索
-D name定义一个宏name,并可以指定值
gcc -E lab.c -o lab.i # 将lab.c文件预处理并输出到lab.i文件内

image-20231018154937176

编译

编译器会将预处理阶段得到的文件进行编译,生成汇编代码。编译的主要任务是将高级语言翻译成汇编语言,如变量、函数、语句等。这一阶段生成的文件称为汇编文件,后缀为“.s”。

编译成汇编代码:

  • 源程序 -> 汇编代码
  • 预处理文件 -> 汇编代码
选项说明
-S只进行编译,不进行汇编,生成汇编代码文件.s
gcc -S lab.c # 生成lab.s文件
gcc -S lab.i -o lab2.s # 生成lab2.s文件

image-20231018155437110

汇编

编译成目标代码

  • 源程序 -> 目标代码
  • 汇编代码 -> 目标代码
选项说明
-c把源文件编译成目标代码( .o ),不进行链接
gcc -c lab.c # 产生lab.o文件

image-20231018155623986

gcc -o out_file file.c # 将文件file.c编译成可执行文件file1;如果未使用该选项,则可执行文件放在a.out中

image-20231018155953015

image-20231018160008666

多文件编译

image-20231018160423756

gcc -o ab a.c b.c

image-20231018160516420

gcc -o ab a.o b.o # 这样更优

当代码和文件很多时,由于每个文件编译都需要时间,且可能每次编译时只是极个别文件发生了改变,此时用第二种方法较优。

gcc的其他选项

选项说明
-g在目标代码中加入供调试程序gdb使用的附加信息
-v显示gcc版本
-Wall显示警告信息
  • 优化程序选项
选项说明
-O0缺省情况,不优化
-O1一级优化
-O2进行比O1高一级的优化
-O3产生更高级别的优化
  • 链接选项
选项说明
-Ldir将dir所指出的目录加到“函数库搜索列表”中
-iname连接时,加载名字为name的函数库(实际的库名是libname)

标准库文件一般存储在/lib/usr/lib目录中

所有的库名都以lib开头

  • 库(Library)
    • 静态库(.a文件)
      • 在程序的链接阶段被复制到了程序中
    • 动态库/共享库(.so文件)
      • 在程序运行时系统动态加载到内存中供程序调用

gdb调试工具

GDB(GNU Debugger)是一款功能强大的开源调试工具,用于调试C、C++、Ada、Objective-C、Fortran等多种编程语言的程序。它可以帮助开发者追踪程序运行时的错误和异常,以及对程序进行调试、分析和优化。

  • 设置断点
  • 监视、修改变量
  • 单步执行
  • 查看堆栈

ubuntu上安装gdb

sudo apt update
sudo apt install gdb

使用gdb调试的前提:在程序编译过程中,使用-g选项生成可执行文件。

gcc -g -o lab lab.c

启动gdb

gdb lab

gdb调试的是可执行文件,不是源文件

image-20231018164235063

文件操作

  • file命令:装入调试程序
  • quit命令:退出gdb
  • shell命令:进入shell环境,执行shell命令

显示源程序

list命令:列出调试程序的源文件。

格式说明
list没有参数,显示当前行开始10行
list +显示当前行之后的10行
list -显示当前行之前的10行
list n显示n行附近的10行
list start,end显示从start到end行的代码
  • show listsize:查看显示的行数
  • set listsize:设置显示的行数

image-20231018164300651

控制程序的执行

break命令:设置断点

info breakpoints:查看断点

image-20231018164936792

delete:删除断点

image-20231018165015697

程序的运行

run:运行程序,执行到断点/程序结束

next:单步执行,不进入函数内部

step:单步执行,进入函数内部

continue:程序从当前位置开始,执行到断点/程序结束

kill:终止正在调试的程序

image-20231018165109917

查看运行时数据

print:显示变量/表达式的值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

set:修改变量的值

image-20231018165216982

display:预先设置一些要显示的表达式

info display:显示当前设置的表达式的清单

delete display:取消对设置的表达式的自动显示功能

显示函数调用堆栈信息

格式说明
backtrace(bt) / where显示函数调用的层次关系
up [n]向上移动n层栈帧
down [n]向下移动n层栈帧

image-20231018165324360

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

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

相关文章

【KOS】安装卸载软件

环境 系统:银河麒麟(KOS)V10(SP1)2303 问题 银河麒麟(KylinOS)原是在“863计划”和国家核高基科技重大专项支持下,国防科技大学研发的操作系统, 后由国防科技大学将品牌…

IDM注册方式

新建一个bat文件,取名IAS_0.8.cmd, 在github上获取脚本内容,地址: https://raw.githubusercontent.com/lstprjct/IDM-Activation-Script/main/IAS_0.8.cmd 也可以直接复制以下内容到IAS_0.8.cmd文件: setlocal Dis…

GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术深度应用

以地下水数值模拟软件GMS操作为主要授课内容,在教学中强调模块化教学,分为前期数据收集与处理;三维地质结构建模;地下水流动模型构建;地下水溶质运移模型构建和反应性溶质运移构建5个模块;采用全流程模式将…

从0-1,使用腾讯OCR进行身份证识别

目录 1.申请腾讯OCR权限 2.代码思路 3.Postman测试​ 1.申请腾讯OCR权限 获取 secretId 和 secretKey,见上文从0到1,申请cos服务器并上传图片到cos文件服务器-CSDN博客https://blog.csdn.net/m0_55627541/article/details/133902798 2.代码思路 入参…

文字智能适配背景

文字智能适配背景 只需要在文字中加上mix-blend-mode属性即可完成 h1 {height: 30px;text-align: center;color: #fff;font-size: 3em;transition: 0.5s;mix-blend-mode: difference; }

CTF/AWD竞赛标准参考书+实战指南

随着网络安全问题日益凸显,国家对网络安全人才的需求持续增长,其中,网络安全竞赛在国家以及企业的人才培养和选拔中扮演着至关重要的角色。 在数字化时代,企业为了应对日益增长的攻击威胁,一般都在大量部署安全产品、…

【经验分享】如何构建openGauss开发编译提交一体化环境

前文 本文适合对openGauss源代码有好奇心的爱好者,那么一个友好的openGauss源代码环境应该是怎么样的。openGauss的开发环境是如何设置的?openGauss的编译环境是如何构建的?如何向openGauss提交代码,笔者集合官方和几位博主实践提…

SpringFramewrok (1)

1、框架的概念与理解 在现实生活中,框架可以比喻为我们搭建房子的框架。 在框架的基础上,我们可以专注于我们自己的工作,而不用在意这些底层工作如何实现。 框架的优点包括以下几点: 1. 提高开发效率:框架提供了许多…

【C++11】 智能指针

一、为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f; int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }void f() {pair<string, string>* …

Linux编译内核添加Bcache模块

由于Bcache是在linux kernel 3.10之后才加入的&#xff0c;所以要使用Bcache&#xff0c;首先必须确保内核版本至少是3.10或及以上&#xff0c;可以使用uname -a查看内核版本 [rootceph01 ~]# uname -a Linux ceph01 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC…

打桩机液压系统比例阀放大板

打桩机液压系统主要由液压油箱、液压泵、液压马达、各种阀门、管道、油缸、活塞等组成。 打桩机液压系统以液压油为工作介质&#xff0c;利用液压油的压力能来驱动执行机构完成所需的各种动作。打桩机液压系统采用液体进行驱动&#xff0c;可以使打桩机在开启时迅速达到理想工…

el-input单独校验

el-input单独校验,效果图如下 <el-col :span"24"><el-form-item label"修订次数:" prop"sPublish"><el-input-numberv-model"addForm.sPublish":min"0":controls"false":precision"0"p…

10月份stable diffusion animatediff等插件使用指南,又来更新了

插件一直会更新&#xff0c;包含了基本市面上流行的90%插件&#xff0c;好用的插件更是不会错过&#xff0c;往期插件请看往期文章&#xff0c;如果你没有时间一直关注sd更新的进展&#xff0c;请关注我&#xff0c;一个月用几个小时看一下我的文章&#xff0c;最短时间跟进sd。…

在中国可以使用 HubSpot 吗?

当谈到市场营销和客户关系管理工具时&#xff0c;HubSpot通常是一家企业的首选。然而&#xff0c;对于许多中国的企业来说&#xff0c;一个重要的问题是&#xff1a;在中国可以使用HubSpot吗&#xff1f;这个问题涉及到不同的方面&#xff0c;包括政策法规、社交媒体平台、语言…

Flask Web 安装bootstrap失败pip install bootstrap

失败原因&#xff1a;网速太慢了 把公共wifi换成手机热点&#xff0c;成功&#xff1a;&#xff09; &#x1f603; 更新&#xff1a;开了手机热点还是报下面的错&#xff0c;但是把科学上网关了&#xff0c;就成功了&#xff0c;反正就是网络问题

深入使用探讨 PuppeteerSharp 抓取 LinkedIn 页面的步骤

LinkedIn是全球最大的职业社交平台之一&#xff0c;拥有大量的用户和企业信息。用户可以在上面建立个人职业资料、与其他用户建立联系、分享职业经验和获取行业动态。由于其庞大的用户群体和丰富的数据资源&#xff0c;开发者们对于获取LinkedIn数据的需求日益增长。 Puppeteer…

华为云云耀云服务器L实例评测|使用clickhouse-benchmark工具对ClickHouse的性能测试

目录 引言 1 ClickHouse简介 2 利用docker安装ClickHouse 2.1 安装Docker 2.2 下载ClickHouse Docker镜像 2.3 创建ClickHouse容器 2.4 访问ClickHouse 3 创建测试表 4 运行 clickhouse-benchmark 5 分析结果 结语 引言 利用华为云的云耀云服务器L实例&#xff0c…

如何开启POP3/SMTP免费邮件代发授权

如何开启POP3/SMTP免费邮件代发授权 一、开启126、163邮箱的免费邮件代发授权服务&#xff08;获取授权码&#xff09;1.登录“网易邮箱”官网客户端2.进入“设置-邮箱设置-邮箱安全设置”3.进入“POP3/SMTP/IMAP”4.验证并开启“POP3/SMTP”服务5.获取到“POP3/SMTP”授权码 二…

再扩国产化信创版图!朗思科技与中科方德完成产品兼容性互认证

近日&#xff0c;北京朗思智能科技有限公司&#xff08;以下简称“朗思科技”&#xff09;自主研发的数字员工产品与中科方德桌面操作系统完成产品认证。测试结果显示&#xff0c;双方产品完全兼容&#xff0c;整体运行稳定&#xff0c;在功能、性能及兼容性方面表现良好&#…

python数据挖掘从入门到实战

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…