【Linux】编译器-gcc/g++与调试器-gdb的使用

这篇具有很好参考价值的文章主要介绍了【Linux】编译器-gcc/g++与调试器-gdb的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.gcc/g++语法

2.gcc的使用及编译器是如何"翻译"代码的?

(1)预处理

(2)编译

(3)汇编

(4)链接

3.动静态库

4.gdb的使用


前言

本篇文章博主将会讲解gcc/g++的使用并搭配编译器相关知识讲解代码翻译的过程,一些常见的gcc/g++语法也会总结出来,在Linux下想要调试代码我们需要借助GUN调试器(gdb),那如何使用gdb博主也会进行讲解。


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================文章来源地址https://www.toymoban.com/news/detail-756312.html

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.gcc/g++语法

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

🐸常用选项速览🐸


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

2.gcc的使用及编译器是如何"翻译"代码的?

(1)预处理

预处理功能主要包括宏替换、头文件展开、条件编译、去注释等,预处理指令是以#号开头的代码行。

实例: gcc –E test.c –o test.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

条件编译多提一嘴:

我们可以通过给编译器传递不同的宏值,来进行对代码的动态裁剪。

实例:gcc test.c -o test -D VERSION1=1

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器


(2)编译

编译阶段,gcc/g++首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,将代码翻译成汇编语言。

实例:gcc -S test.i -o test.s

用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

-o选项是指目标文件,“xxx.s”文件为已经过翻译的原始程序。

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器


(3)汇编

汇编阶段是把编译阶段生成的“xxx.s”文件转成目标文件。

实例:gcc –c test.s –o test.o

-c选项可以得到汇编代码转化为“xxx.o”的二进制目标代码了。

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器


(4)链接

在成功完成以上步骤之后,就进入了链接阶段。

链接的主要任务就是将生成的各个“xxx.o”文件进行链接,生成可执行文件。

gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。

实例:gcc test.o –o test

巧记:键盘左上角ESC分别对应预处理、编译、汇编。

若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out。

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

在我们编写代码时时常需要使用库函数中的函数,比如stdio.h中的printf函数,但当我们展开stdio.h文件后发现也只是有printf的函数声明,那么这些库函数的定义放在哪里了呢?

就以stdio.h头文件举例,里面的库函数实现在了名为libc.so.6(C标准库)的库文件中。在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现printf函数了,而这也就是链接的作用。


3.动静态库

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。

动静态库的优缺点对比:

动静态链接比对
链接方式 库及特性 Linux(后缀) Windows(后缀)
动态链接 动态库(被多个使用者共同使用,一旦缺失,所有程序都不可以运行了) .so .dll
静态链接 静态库(不需要关联,将库文件代码直接拷贝到可执行文件中) .a .lib

动态库

  • 优点:节省资源(包括磁盘、内存、网络等资源),不会出现太多重复代码。
  • 缺点:对库的依赖性较强,一旦库丢失,所有使用这个库的程序都无法运行。

静态库

  • 优点:不依赖库,同类型平台中都可以直接运行。
  • 缺点:可执行程序体积较大,比较浪费自愿。

动态链接实例:gcc -o mybin mytest.c(Linux默认)

静态链接实例:gcc -o mybin-static mytest.c -static


可利用file查看可执行文件的链接方式:

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

 比对下静态链接与动态链接生成的可执行文件的大小:

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器

所以说静态链接安全可靠,但是浪费资源。 


可利用ldd 文件名查看可执行文件所依赖的库(当有缺失时会有提示):

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器


4.gdb的使用

首先我们知道程序的发布方式有两种:

  • debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
  • release版本:不会添加任何调试信息,是不可调试的。

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。

如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。

【Linux】编译器-gcc/g++与调试器-gdb的使用,Linux,linux,运维,服务器


 🐸gdb语法速览🐸

【安装gdb】

  • sudo yum install -y gdb 

【进入gdb】

  • 指令: gdb 文件名

【调试】

  • 「run/r」:运行代码(启动调试)。
  • 「next/n」:逐过程调试。
  • 「step/s」:逐语句调试。
  • 「until 行号」:跳转至指定行。
  • 「finish」:执行完当前正在调用的函数后停下来(不能是主函数)。
  • 「continue/c」:运行到下一个断点处。
  • 「set var 变量=x」:修改变量的值为x。

【显示】

  • 「list/l n」:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。
  • 「list/l 函数名」:显示该函数的源代码。
  • 「print/p 变量」:打印变量的值。
  • 「print/p &变量」:打印变量的地址。
  • 「print/p 表达式」:打印表达式的值,通过表达式可以修改变量的值。
  • 「display 变量」:将变量加入常显示(每次停下来都显示它的值)。
  • 「display &变量」:将变量的地址加入常显示。
  • 「undisplay 编号」:取消指定编号变量的常显示。
  • 「bt」:查看各级函数调用及参数。
  • 「info/i locals」:查看当前栈帧当中局部变量的值。

【断点】

  • 「break/b n」:在第n行设置断点。(多文件"在test.c文件的第7行"打断点:b test.c:7)
  • 「break/b 函数名」:在某函数体内第一行设置断点。
  • 「info breakpoint/b」:查看已打断点信息。
  • 「delete/d 编号」:删除指定编号的断点。
  • 「disable 编号」:禁用指定编号的断点。
  • 「enable 编号」:启用指定编号的断点。

【退出gdb】

  • 「quit/q」:退出gdb。

=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

到了这里,关于【Linux】编译器-gcc/g++与调试器-gdb的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【UNIX 环境编程】GCC 编译器 | Makefile 基础入门 | GDB 调试教学

    💭 写在前面: 本文将介绍如何使用 GCC 编译器编译,并详细介绍了 Makefile 的基本构造、创建Makefile 文件以及 Makefile 变量,以提高编译效率。此外,本文还将探讨GDB调试器的使用,包括调试前的准备、readelf 读取 ELF 文件信息、显示代码、断点、调试、监视、跳转等内容。 

    2024年02月03日
    浏览(55)
  • 为 Microsoft C++ 配置 VS Code在本教程中,您将配置 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 编译器和调试器

    在本教程中,您将配置 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 编译器和调试器。 配置完 VS Code 后,你将在 VS Code 中编译和调试一个简单的 Hello World 程序。本教程不教您有关 Microsoft C++ 工具集或 C++ 语言的详细信息。对于这些主题,网上有很多很好的资源。 如果您

    2024年02月10日
    浏览(57)
  • Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具

    目录 Ⅰ.  Linux 软件包管理器 yum 一、yum 背景知识 二、yum 的基本使用 1、查看软件包 2、软件包名称构成 3、安装软件 4、卸载软件 Ⅱ.vim编辑器  一、认识vim 1、vim概念  2、模式及其切换  二、vim使用 1、vim的指令(重要)  命令模式 插入模式 底行模式 2、vim配置 Ⅲ.gcc/g++编

    2024年02月05日
    浏览(44)
  • [linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

    目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序  ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译  c.汇编  d.链接 ③.执行Main 二进制可执行程序(.exe文件)  三.总结  使用yum命令(相当于手机上的应用市场)来进行安装.  下载完毕之后,使用 which gc

    2024年04月10日
    浏览(44)
  • Linux调试器gdb

    本文已收录至《 Linux知识与编程 》专栏! 作者: ARMCSKGT 演示环境: CentOS 7     ​ 目录 前言 正文 下载gdb 生成可调式文件 进入gdb gdb常用指令 查看代码 l  运行程序 r  断点设置 b  显示信息 info  查看断点 info b  删除断点 d  禁用断点 disable breakpoints  启用断点 enable brea

    2024年02月14日
    浏览(42)
  • Linux--调试器:gdb

    gcc与g++默认动态链接形成的可执行程序(比如a.out)是 release 版本,不可调试!!! 如何搞成debug可调试版本? 查看可执行程序存储了哪些内存空间:   调试语法:

    2024年02月13日
    浏览(38)
  • Linux——gdb调试器

    目录    前言: 二.gdb定义及指令: 如何查看该exe文件是否为Debug版本?两种方法: 三.gdb调试:         调试指令1:l指令(小写L) run指令:运行程序,相当于VS中的直接运行不调试——可简化输入r  break指令:设置断点——指令可简化输入为b ​编辑  info b指令:查看整个代码

    2024年02月07日
    浏览(27)
  • Linux - 还不懂 gdb 调试器?(调试软件)

    当前,我们可以使用 make/makefile 来程序化执行代码文件;可以使用 gcc/g++ 等编译器来编译代码;可以使用 vim 编辑器来编写代码;其实在 Linux 当中还有一个工具,可以实现调试工作,这个工具就是 -- gdb。 在了解调试器之前,你应该对代码的发布版本做一些了解: 我们在 VS

    2024年02月07日
    浏览(40)
  • Linux调试器之gdb

    我们前面介绍了几个基本的环境开发工具。例如通过yum我们可以安装和卸载软件、通过vim我们可以写代码、通过gcc和g++我们可以编译代码成可执行程序。但是如何在Linux下调试代码呢?我们并未介绍,本期我们将来介绍最后一个工具 --- 调试器gdb。 程序的发布方式 gdb基本的调

    2024年04月16日
    浏览(52)
  • 【Linux】Linux调试器-gdb使用

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 退出:  调试命令: list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。 list/l 函数名:列出某

    2024年02月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包