【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用

ops/2024/9/24 3:02:54/

目录

背景知识

编译器gcc/g++的安装

编译器gcc/g++的使用

调试器gdb的使用

cgdb 

条件断点


背景知识

子曰:“温故而知新”。在谈gcc/g++的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。

编译器gcc/g++的安装

在CentOS下,安装的指令为 sudo yum install -y gcc

在Ubuntu下,安装的指令为 sudo apt install -y gcc

编译器gcc/g++的使用

gcc和g++的使用方法很类似,因为它们的选项基本一样。

● -E,在预处理结束后停止编译过程。

● -S,编译完成就停下。

● -c,汇编完成就停下。

● -g,生成调试信息。

编译器优化选项的4个级别:

● -O0

● -O1

● -O2

● -O3

其中,-O0表示没有优化,-O1为缺省值,-O3的优化级别最高。

其他选项:

● -w,不生成任何警告信息。

● -Wall,生成所有警告信息。

下面,我们来练练手。

1)将test.c进行预处理,生成test.i文件。

我们打开test.i瞅一眼。

2)将test.i进行编译生成test.s文件。

 

我们打开test.s看看。

可以看到,已经变成汇编指令了。

3)将test.s进行汇编生成test.c文件。

 

当我们在打开test.o时,会发现我们已经看不懂了,汇编指令已经被转换成机器可识别的二进制代码。

4)-g选项有无的对比

我们可以看到,加了-g选项生成的_g_test文件要比没加-g选项生成的test文件要大,这是因为_g_test文件里包含了调试信息,而test中没有包含。 

调试器gdb的使用

程序的发布方式有两种,debug模式和release模式,gcc/g++直接编译出来的二进制程序,默认是release模式。如果我们要使用gdb调试,就必须在编译的时候加上-g选项。至于-g选项怎么加,上面已经演示过了。下面我们正式进入gdb的使用。

指令:gdb code   / /打开code进行调试 

● ctrl + d 或 quit,退出调试。

● list 或 l 行号,以所指定行号为中心显示源代码,一次10行。

● list 或 l 函数名,列出指定函数的源代码。

● run 或 r,运行程序。

● n 或 next,逐过程调试(不会进入函数内部)。

● s 或step,逐语句调试(会进入函数内部)。 

● b 或 break 行号,在指定行设置断点。

● break 函数名,在指定函数开头设置断点。

● info break,查看断点信息。

● finish,执行当前函数,然后停下。

● p 变量,打印变量的值。

● set var,修改变量的值。

● c 或continue,从当前位置开始运行。

● delete breakpoints,删除所有断点。

● d n,删除序号为n的断点。

● delete breakpoints,删除所有断点。

● disable breakpoints,禁用所有断点。

● disable breakpoint n,禁用n号断点。

● enable breakpoints,启用所有断点。

● enable breakpoint n,启用n号断点。

● info b,查看所有断点信息。

● until 行号,跳到指定行。

● display 变量名,跟踪查看一个变量,每次停下来都显示它的值。

● undisplay,取消对先前设置的变量的跟踪。 

cgdb 

cgdb是gdb的一个图形界面版本,它具有gdb的所有功能,相较于gdb,cgdb便于我们查看源代码。

CentOS下,安装指令 sudo yum install -y cgdb。

Ubuntu下,安装指令 sudo apt install -y cgdb。

用法:cgdb 文件,例如,cgdb code。

条件断点

通过前面的学习,我们已经掌握了如何打断点,现在我们来学习如何打条件断点。

关键字:condition

语法:condition 断点编号 条件

下面举个简单的例子。

上述设置的条件断点的意思是:如果a等于20就停下来,否则不停下。我们可以看到,在运行起来后,程序停在了第12行,也就是说跳过了第一个断点,因为a不等于20,导致条件断点没生效。


本文到这就结束啦~如有错误,请您不吝指出! 


http://www.ppmy.cn/ops/113435.html

相关文章

C#中线程池【异步】

在 WinForm 项目中,线程池中的线程主要用于执行异步和并发任务。当你调用某些异步方法或使用并行编程时,线程池中的线程就会被使用。 在以下场景中,线程池的线程会被使用: 使用场景 异步任务执行 当你使用 Task.Run() 或 TaskF…

Spring学习前置知识

Spring作用 Spring是一个轻量级的开源框架,是为解决企业级应用开发的复杂性而创建的,通过核心的Bean Factory实现了底层类的实例化和生命周期的管理; Spring的根本使命:简化Java开发 OCP开闭原则 开放封闭原则(OCP&…

C语言 | Leetcode C语言题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; bool canPartition(int* nums, int numsSize) {if (numsSize < 2) {return false;}int sum 0, maxNum 0;for (int i 0; i < numsSize; i) {sum nums[i];maxNum fmax(maxNum, nums[i]);}if (sum & 1) {return false;}int tar…

【开源免费】基于SpringBoot+Vue.JS企业客户管理系统(JAVA毕业设计)

本文项目编号 T 036 &#xff0c;文末自助获取源码 \color{red}{T036&#xff0c;文末自助获取源码} T036&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 管理员角色1.2 普通员工角色1.3 系统特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内…

python画图|在3D图上画2D直方图(作图平面移动)

前期我们已经学习过2D和3D的直方图绘制&#xff1a; 二维常规直方图绘制&#xff1a;python画图|水平直方图绘制_绘制水平直方图-CSDN博客 二维极坐标直方图绘制&#xff1a;python画图|极坐标中画直方图_ax1.plot()怎么画直方图-CSDN博客 三维直方图绘制&#xff1a;python…

代码修改后向Git提交的详细步骤

代码修改后向Git提交的详细步骤 在软件开发过程中&#xff0c;版本控制是一个不可或缺的部分。Git是目前最流行的分布式版本控制系统&#xff0c;它帮助开发者管理代码的变更历史&#xff0c;协作开发&#xff0c;以及追踪bug和功能。本文将详细介绍如何在本地修改代码后&…

如何查看电脑什么时候被人动过及看过的文件?

一、查看Windows事件查看器 Windows系统具有强大的日志记录功能&#xff0c;通过“事件查看器”可以查看电脑的使用记录。具体步骤如下&#xff1a; 按下Win R组合键打开运行窗口&#xff0c;输入eventvwr.msc命令并回车&#xff0c;打开事件查看器。 在事件查看器中&#x…

跨境电商测评自养号创建、管理和优化技巧,低成本高效益的推广策略

跨境电商这块大蛋糕让国内的小伙伴们找到了新商机&#xff0c;现在越来越多人都开始做跨境了&#xff0c;但很多人还不太清楚怎么做&#xff0c;销量很难做起来。有什么办法呢&#xff1f;今天我就给大家说说现在大部分卖家都在做的——测评。 测评是啥呢&#xff1f;就是卖家找…