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.hqwc.cn/news/464403.html

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

相关文章

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…

43.1k star, 免费开源的 markdown 编辑器

简介 项目名&#xff1a; MarkText-- 简单而优雅的开源 Markdown 编辑器 Github 开源地址&#xff1a; https://github.com/marktext/marktext 官网&#xff1a; https://www.marktext.cc/ 支持平台&#xff1a; Linux, macOS 以及 Windows。 操作界面&#xff1a; 在操作界…

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

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Blank组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Blank组件 空白填充组件&#xff0c;在容器主轴方向上&#xff0c;空白填充组件具…

linux优化空间完全卸载mysql——centos7.9

文章目录 ⭐前言⭐linux命令使用&#x1f496; 基础命令&#x1f496; 内存优化&#x1f496; 完全删除mysql ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;linux优化空间&完全卸载mysql——centos7.9。 linux内存分配 在Linux中&#xff0c;内存分配是通过几种…

Caché 为什么在医疗系统中吐槽

目前所知的 Cach 是应用在医院信息系统&#xff08;即 HIS&#xff09;&#xff0c;据说在欧美医疗卫生行业&#xff0c;Cach 占了 70% 的市场份额。国内的东华软件就是采用 Cach 数据库&#xff0c;东华软件在国内医院市场占有率大致为 20%&#xff0c;其中包括北京协和医院、…

数据结构——5.5 树与二叉树的应用

5.5 树与二叉树的应用 概念 结点的权&#xff1a;大小可以表示结点的重要性 结点的带权路径长度&#xff1a;从树的根到该结&#xff0c;的路径长度&#xff08;经过的边数&#xff09;与该结点权的乘积 树的带权路径长度&#xff1a;树中所有叶结点的带权路径长度之和(WPL) …

openresty (nginx)快速开始

文章目录 一、什么是openresty&#xff1f;二、openresty编译安装1. 编译安装命令1.1 编译完成后路径1.2 常用编译选项解释 2. nginx配置文件配置2.1 nginx.conf模板 3. nginx常见配置一个站点配置多个域名nginx配置中location匹配规则 三、OpenResty工作原理OpenResty工作原理…

OpenCV-32 膨胀操作

膨胀是与腐蚀相反的操作&#xff0c;基本原理是只要保证卷积核的锚点是非0值&#xff0c;周边无论是0还是非0值&#xff0c;都变为0。 使用API---dilate&#xff08;img&#xff0c; kernel&#xff0c; iterationms 1&#xff09; 示例代码如下&#xff1a; import cv2 imp…

Linux 从日志中抽取信息,批量生成SQL语句并执行

这里写目录标题 一. 需求分析二. 从日志中抽取出指定字段&#xff0c;并切分为若干个子文件三. 生成查询执行计划四. 生成查询的SQL语句五. 检查并执行 一. 需求分析 有如下日志文件&#xff0c;假设日志文件中有10000条数据&#xff0c;要求将全部的TRANSACTIONID抽取出来&am…

PKI - 借助Nginx 实现Https_使用CA签发证书

文章目录 Pre概述操作步骤1. 生成 CA 密钥对2. 生成自签名的 CA 证书3. 生成服务器密钥对和证书签名请求 (CSR)4. 使用 CA 签署服务器证书 Nginx Https 自签证书1. 生成自签名证书和私钥2. 配置 Nginx 使用 CA签发的 HTTPS 证书3. 重启 Nginx 服务4. 直接访问5. 不验证证书直接…

第72讲后台管理Container布局实现

新建layout目录 登录成功后&#xff0c;跳转layout布局容器页面 login页面&#xff1a; 导入router import router from "/router";登录成功&#xff0c;跳转后台管理页面 选用布局容器&#xff1a; <template><div class"common-layout">…

fast.ai 机器学习笔记(二)

机器学习 1&#xff1a;第 5 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续更…