Linux开发工具的使用 (gcc/g++ | gdb)

目录

一、gcc/g++

1.关于gcc/g++

2.gcc如何使用

gcc选项:

预处理:

编译:

汇编:

连接:

 函数库是什么:

函数库分为动态库和静态库两种

二、调试器gdb

1.关于gdb

2. gdb的使用

gdb选项:


Linux是一个广泛用于开发的操作系统,提供了许多强大的工具和环境来支持开发者.

一、gcc/g++

1.关于gcc/g++

GCC(GNU Compiler Collection)是一个由GNU Project开发的编程语言编译器集合,包括C、C++、Objective-C、Fortran、Ada和Go等语言的编译器。其中,g++是GCC的C++编译器。

GCC/G++是一个开源的编译器,可在多种操作系统上运行,包括Linux、Windows和macOS等。它支持多种标准,包括C89、C99、C11、C++98、C++11、C++14和C++17等,能够编译符合这些标准的源代码。

GCC/G++具有强大的优化能力,能够生成高效的机器代码。它还提供了丰富的编译选项,可以根据需要进行调整以优化编译过程和生成的代码。

2.gcc如何使用

使用指令格式

gcc [ 选项 ] 要编译的文件 [ 选项 ] [ 目标文件 ]

gcc选项:

-E 只激活预处理 , 这个不生成文件 , 你需要把它重定向到一个输出文件里面
-S  编译到汇编语言不进行汇编和链接
-c  编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g  生成调试信息。 GNU 调试器可利用该信息。
-shared  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库 .
-O0
-O1
-O2
-O3 编译器的优化选项的 4 个级别, -O0 表示没有优化 ,-O1 为缺省值, -O3 优化级别最高
-w  不生成任何警告信息。
-Wall 生成所有警告信息

我们先编写一个简单程序

预处理:

预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。
预处理指令是以 # 号开头的代码行。
实例 : gcc –E code.c –o code.i
选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项 “-o” 是指目标文件 ,“.i” 文件为已经过预处理的 C 原始程序

编译:

在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用 “-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。
实例 : gcc –S code.i –o code.s

汇编:

汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件
读者在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码了
实例 : gcc –c code.s –o code.o

连接:

在成功编译之后 , 就进入了链接阶段。
实例 : gcc code.o –o code

我们现编写一个makefile文件(前面文章有过介绍),便于生成可执行文件:

这样只是为了理解过程,但是实际上还是建议写成

code:code.c

        gcc -o code code.c

这样使用起来才最为方便。

然后执行得到

 函数库是什么:

我们的 C 程序中,并没有定义 “printf” 的函数实现 , 且在预编译中包含的 “stdio.h” 中也只有该函数的声明 , 而没有定义函数的实现, 那么 , 是在哪里实 “printf” 函数的呢 ?
系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了 , 在没有特别指定时 ,gcc 会到
系统默认的搜索路径 “/usr/lib” 下进行查找 , 也就是链接到 libc.so.6 库函数中去 , 这样就能实现函
“printf” , 而这也就是链接的作用

函数库分为动态库和静态库两种

静态库是指编译链接时 , 把库文件的代码全部加入到可执行文件中 , 因此生成的文件比较大 , 但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反 , 在编译链接时并没有把库文件的代码加入到可执行文件中 , 而是在程序执行时由运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为 “.so”, 如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后 ,gcc 就可以生成可执行文件。
gcc 默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

二、调试器gdb

1.关于gdb

GDB(GNU Debugger)是一个由GNU Project开发的强大的调试器,用于调试C、C++等编程语言的程序。它可以在程序运行时检查变量的值、跟踪程序的执行流程、查看内存中的数据等,帮助开发人员找出程序中的错误和问题。

GDB支持多种操作系统,包括Linux、Windows和macOS等,可以用于调试本地程序和远程程序。它提供了丰富的调试功能,如设置断点、单步执行、查看变量值、回溯函数调用栈等,能够帮助开发人员快速定位和解决程序中的bug。

除了基本的调试功能,GDB还支持脚本编程,可以编写Python或者其他脚本语言来扩展和定制调试器的功能。这使得GDB成为了一个非常灵活和强大的调试工具,被广泛应用于各种类型的软件开发项目中。

2. gdb的使用

程序的发布方式有两种, debug 模式和 release 模式
Linux gcc/g++ 出来的二进制程序,默认是 release 模式
要使用 gdb 调试,必须在源代码生成二进制程序的时候 , 加上 - g 选项

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
我们使用下段程序来使用一些基本功能:
#include <stdio.h>
#include <stdlib.h>
int make_key(void);
int get_key_num(void);
int number(void);
int main(void)
{
int ret = make_key();
printf("make_key returns %d\n", ret);
exit(EXIT_SUCCESS);
}int make_key(void)
{int ret = get_key_num();return ret;
}int get_key_num(void)
{int ret = number();return ret;
}
int number(void)
{return 10;
}

使用命令编译并生成调试信息

在命令行中输入以下命令启动 GDB 并加载可执行文件。

gdb ./callstk

使用l显示源代码:

 

使用 break 命令设置断点

使用 run 命令运行程序,并在断点处暂停。

使用 step 命令逐行执行程序

当程序暂停时, make_key 函数内部暂停时,可以查看 ret 变量的值。
也可以使用display 变量名来追踪
在每次停下来后都会显示它的值:

使用 backtrace 命令查看当前的调用栈,即函数的调用链。

退出函数
以上只是GDB的一些基本命令和用法,GDB还提供了许多其他功能,如条件断点、观察点、回溯调用栈等,可以根据需要深入学习和掌握。

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

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

相关文章

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

vue核心技术(二)

◆ 指令补充 指令修饰符 通过 "." 指明一些指令 后缀&#xff0c;不同 后缀 封装了不同的处理操作 → 简化代码 v-bind 对于样式控制的增强 为了方便开发者进行样式控制&#xff0c; Vue 扩展了 v-bind 的语法&#xff0c;可以针对 class 类名 和 style 行内样式…

KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340)ABCDEF 视频讲解

这场比较郁闷&#xff0c;C题短路&#xff0c;连续4次WA&#xff0c;导致罚时太多 A - Arithmetic Progression Problem Statement Print an arithmetic sequence with first term A A A, last term B B B, and common difference D D D. You are only given inputs for w…

BootstrapBlazor 模板适配移动设备使用笔记

项目模板 Bootstrap Blazor App 模板 为了方便大家利用这套组件快速搭建项目&#xff0c;作者制作了 项目模板&#xff08;Project Templates&#xff09;&#xff0c;使用 dotnet new 命令行模式&#xff0c;使用步骤如下&#xff1a; 安装项目模板 dotnet new install Boo…

007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码&#xff0c;离了指针是很难办到的。 2、因为VB/VBA里&#xff0c;用Long来表示指针&#xff0c;而32位(包括64位兼容的)计算机里4字节整数的处理&#xff0c;是最快的方式&#xff01; 3、要想用指针来处理数据&#xff0c;…

fast.ai 深度学习笔记(六)

深度学习 2&#xff1a;第 2 部分第 12 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-12-215dfbf04a94 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;…

Vue-55、Vue技术vuex模块化

一、代码 1、store.js //改文件用于创建最为核心的store //引入vue import Vue from "vue"; //引入vuex import Vuex from vuex;//求和功能相关的配置 const countOptions{namespaced:true,actions:{jia:function (context,value) {console.log(action中的jia被调…

C语言什么是悬空指针?

一、问题 什么是悬空指针&#xff1f;为什么会出现&#xff1f;我们该如何避免悬空指针的出现&#xff1f; 二、解答 在C语言中&#xff0c;悬空指针指的是指向已删除&#xff08;或释放&#xff09;的内存位置的指针。如果一个指针指向的内存被释放&#xff0c;但指针本身并未…

如何实现视线(目光)的检测与实时跟踪

如何实现视线(目光)的检测与实时跟踪 核心步骤展示说明 找到人脸 检测人脸特征点 根据特征点找到人眼区域 高精度梯度算法检测瞳孔中心 根据眼睛周边特征点计算眼睛中心 瞳孔中心和眼睛中心基于视线模型计算视线方向 视线方向可视化 详细实现与说明&#xff1a; https://stud…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后&#xff0c;立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

Linux目录的 /usr/bin 和 /usr/local/bin 的区别

Linux目录的 /usr/bin 和 /usr/local/bin 的区别 usr 是指 Unix System Resource&#xff0c;而不是User usr 是 Unix System Resource&#xff0c;而不是User /usr/bin下面的都是系统预装的可执行程序&#xff0c;系统升级有可能会被覆盖. /usr/local/bin 目录是给用户放置…

【深度学习】:实验6布置,图像自然语言描述生成(让计算机“看图说话”)

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;深度学习专栏持续更新中&#xff0c;期待的小伙伴敬请关注 实验答案链接http://t.csdnimg.cn/bA48U 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 案例 6 &#xff1a;图像自…

Hadoop运行环境搭建

模板虚拟机环境准备 1&#xff09;准备一台模板虚拟机hadoop100&#xff0c;虚拟机配置要求如下&#xff1a; 模板虚拟机&#xff1a;内存4G&#xff0c;硬盘50G&#xff0c;安装必要环境&#xff0c;为安装hadoop做准备 [roothadoop100 ~]# yum install -y epel-release [r…

命令行随笔

1、xargs xargs命令是将 前一个命令的标准输出作为后一个命令的命令行参数&#xff0c;xargs的默认命令是echo&#xff0c;默认定界符是空格和回车。 而管道是将 前一个命令的标准输出作为后一个命令的标准输入 echo例子 # echo "apple banana orange" | xargs e…

MySQL篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、SQL 语言包括哪几部分?每部分都有哪些操作关键二、完整性约束包括哪些?三、什么是锁?四、什么叫视图?游标是什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

梯度提升树系列8——GBDT与其他集成学习方法的比较

目录 写在开头1. 主要集成学习算法对比1.1 GBDT1.2 随机森林1.3 AdaBoost1.4 整体对比2. 算法性能的比较分析2.1 准确率与性能2.2 训练时间和模型复杂度2.3 应用实例和案例研究3. 选择合适算法的标准3.1 数据集的特性3.1.1 数据规模与维度3.1.2 数据质量3.2 性能需求3.2.1 准确…

Unity报错Currently selected scripting backend (IL2CPP) is not installed

目录 什么是il2cpp il2cpp换mono Unity打包报错Currently selected scripting backend (IL2CPP) is not installed 什么是il2cpp Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式。由于iOS AppStore…

pandas dataframe写入excel的多个sheet页面

pandas根据dataframe生成一个excel文件&#xff1a; Dataframe保存新文件 直接把dataframe格式的数据保存到多个sheet页程序如下&#xff1a; excel_file "导出excel文件.xlsx" if os.path.exists(excel_file):os.remove(excel_file)# 生成一个新文件 with pd.Ex…

怎么对接快团团团长?如何对接快团团团长?

1、首先来说&#xff0c;你要需要&#xff0c;树立良好的心态&#xff0c;拓展快团团大团长合作和开发传统渠道是一样的&#xff0c;能有10%的回复率就不错了&#xff0c;反复几次沟通也是非常有必要的。要有“大团长思维”&#xff0c;就是换位思考&#xff0c;他们是处于什么…