gcc编译器和gdb调试工具

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.rhkb.cn/news/162413.html

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

相关文章

jmeter(三十三):阶梯线程组Stepping Thread Group,并发线程Concurrency Thread Group

Stepping Thread Group参数详解 this group will start:表示总共要启动的线程数;若设置为 100,表示总共会加载到 100 个线程first,wait for:从运行之后多长时间开始启动线程;若设置为 0 秒,表示运行之后立即启动线程then start:初次启动多少个线程;若设置为 0 个,表示…

DH48WK 温控器参数设置

北京东昊力伟科技有限责任公司 温控仪、温度控制器 产品特点: 可外接温度传感器Pt100、Cu50、K、E、J、N、T、R、S、B兼容输入;PID控制输出、位式控制输出、继电器报警输出;控温能满足设定温度值的0.2℃;既可用于加热控制、也可…

通讯协议学习之路:USART协议理论

通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374) 一、…

易点易动设备管理系统:提升生产企业设备保养效率的利器

在现代生产企业中,设备保养是确保生产线稳定运行和产品质量的关键环节。然而,传统的设备保养方式往往面临效率低下、数据不准确等问题,影响了生产效率和竞争力。随着科技的进步,易点易动设备管理系统应运而生,以其智能…

短视频矩阵系统/pc、小程序版独立原发源码开发搭建上线

短视频剪辑矩阵系统开发源码----源头搭建 矩阵系统源码主要有三种框架:Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架,提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架,用于将数…

【算法训练-排序算法 三】【排序应用】合并区间

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【合并区间】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

05在IDEA中配置Maven的基本信息

配置Maven信息 配置Maven家目录 每次创建Project工程后都需要设置Maven家目录位置,否则IDEA将使用内置的Maven核心程序和使用默认的本地仓库位置 一般我们配置了Maven家目录后IDEA就会自动识别到conf/settings.xml配置文件和配置文件指定的本地仓库位置创建新的P…

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

vim、gcc/g++、make/Makefile、yum、gdb

vim、gcc/g、make/Makefile、yum、gdb 一、Linux编辑器vim1、简介2、三种模式的概念&#xff08;1&#xff09;正常/普通/命令模式(Normal mode)&#xff08;2&#xff09;插入模式(Insert mode)&#xff08;3&#xff09;末行/底行模式(last line mode) 3、三种模式的切换4、正…

SLAM从入门到精通(bresenham绘制算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;学术界和工业界对于slam的要求是不一样的。前者要求robot在运动的过程中&#xff0c;同步实现定位和制图的操作。但是工业…

力扣环形链表(1)进阶环形链表(2)及环形链表的约瑟夫问题

为了加深对环形链表的理解和掌握&#xff0c;这两道题是很不错的选择。 这里所说环形链表不是一个圈圈的结构&#xff0c;而是带环链表。 链接&#xff1a;环形链表&#xff08;1&#xff09; 注意这里链表的长度 所以要注意链表是否为空 第一种方法&#xff0c;应该是比较容易…

【ELK 使用指南 1】ELK + Filebeat 分布式日志管理平台部署

ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…

宏电股份RedCap产品亮相迪拜华为MBBF,并参与RedCap全球商用阶段性成果发布

10月10-11日&#xff0c;由华为主办的第十四届全球移动宽带论坛&#xff08;MBBF&#xff09;在阿联酋迪拜成功举办。MBBF期间&#xff0c;华为联合宏电股份等产业伙伴集中发布RedCap商用阶段性成果。本次发布是RedCap产业的关键里程碑&#xff0c;标志着RedCap在全球已具备规模…

c++小知识

内联函数 inline 用来替换宏函数 不能分文件编辑 在c语言中#define NULL 0在c中使用nullptr表示空指针class内存的大小计算规则使用的是内存对齐 没有成员&#xff0c;但是还有1个字节&#xff0c;我们使用这个来标记他是个类 类成员函数不存在于类中 为什么每个对象使用的…

提高编程效率-Vscode实用指南

您是否知道全球73%的开发人员依赖同一个代码编辑器&#xff1f; 是的&#xff0c;2023 年 Stack Overflow 开发者调查结果已出炉&#xff0c;Visual Studio Code 迄今为止再次排名第一最常用的开发环境。 “Visual Studio Code 仍然是所有开发人员的首选 IDE&#xff0c;与专业…

和硕首次参加展OCP 峰会,将发布多项AI合作项目产品 | 百能云芯

电子代工大厂和硕联合科技宣布&#xff0c;将参与今年的 OCP 全球峰会 (OCP Global Summit)&#xff0c;展示与英伟达 (NVIDIA) 合作成果&#xff0c;包含使用英伟达 GH200 Grace Hopper 超级芯片的 MGX AI 服务器&#xff0c;以及搭载 A100、L40 等服务器产品。 OCP 峰会于 10…

【STM32】---存储器,电源核时钟体系

一、STM32的存储器映像 1 文中的缩写 2 系统构架&#xff08;原理图&#xff09; 3. 存储器映像 &#xff08;1&#xff09;STM32是32位CPU&#xff0c;数据总线是32位的 &#xff08;2&#xff09;STM232的地址总线是32位的。&#xff08;其实地址总线是32位不是由数据总线是…

Tortoise SVN 察看本地缓存密码

1、打开设置&#xff08;Settings&#xff09; 2、查看保存的数据 3、打开鉴权数据 4、查看密码 CTRLSHIFT双击表格&#xff0c;就会出现一列密码列 &#xff08;我的是Mac PD虚拟Win11&#xff0c;CTRLSHIFTOPTION双击表格&#xff09; 原文见这里&#xff1a; Recover SVN …

【ubuntu】常用软件安装

【ubuntu】常用软件安装 前言安装搜狗输入法安装flameshot截图软件总结 前言 Ubuntu 是一个基于 Linux 内核的开源操作系统&#xff0c;它提供了简单易用的界面和丰富的功能&#xff0c;广受开发者和普通用户的喜爱。博主时常也需要经常切换Ubuntu系统进行开发和学习&#xff…

2023系统架构师---信息系统基础知识

目录 信息系统基础知识 信息系统概述 信息系统开发方法 1.结构化方法 2&#xff0c;原型法 3.面向对象方法 4.面向服务的方法 信息系统基础知识 信息系统是一个由人、计算机等组成的能进行信息的收集、传递、存储、加工、维护和使用的系统&#xff0c;它是一门综合了经济…