【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)
阅读导航
- 前言
- 一、什么是调试器
- 二、详解 GDB - 调试器
- 1.使用前提
- 2.经常使用的命令
- 3.使用小技巧
- 三、项目自动化构建工具 - make/Makefile
- 1. make命令
- ⭕语法
- ⭕常用选项
- ⭕常用操作
- ⭕make命令的工作原理
- ⭕make命令的优势:
- 2.Makefile文件
- ⭕Makefile的基本结构
- ⭕Makefile文件中常用的指令和语法
- ⭕Makefile的约定和惯例
- ⭕Makefile的工作原理
- 总结
- 温馨提示
前言
前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,今天博主带大家了解一下 —— Linux系统下的调试器-gdb、项目自动化构建工具-make/Makefile, 下面话不多说坐稳扶好咱们要开车了!!!😍
一、什么是调试器
调试器是一种工具,用于帮助开发人员诊断和修复程序中的错误。它可以让你逐行执行代码,观察变量的值,并提供有关程序执行流程的详细信息。
✅一些常见的调试器包括:
- GDB(GNU调试器):适用于C和C++等编程语言,可在命令行界面下使用。
- LLDB(LLVM调试器):一款用于C、C++、Objective-C 和 Swift 的开源调试器,兼容多种平台。
- Visual Studio Debugger:适用于Windows平台的调试器,可与Microsoft Visual Studio集成使用。
- PyCharm Debugger:专为Python开发的调试器,可在PyCharm集成开发环境中使用。
- Xcode Debugger:适用于苹果开发者的调试器,可在Mac和iOS设备上调试应用程序。
⭕VS下的调试环境
⭕GDB命令行模式的调试
✅调试器的一般使用步骤如下:
- 启动调试器,并将程序加载到调试器中。
- 设置断点,这样程序会在断点处暂停执行。
- 逐行执行代码,观察变量的值和程序的行为。
- 使用调试器提供的命令和功能来检查程序状态、查找错误并进行修复。
- 在逐步执行代码时,可以观察程序的执行流程和控制流的变化。
- 跟踪程序执行流程,查找潜在的逻辑错误和异常。
二、详解 GDB - 调试器
1.使用前提
在使用GDB调试器之前,你需要满足以下前提条件:
-
安装GDB:首先,你需要在你的计算机上安装GDB调试器。GDB是一个开源工具,可以从GNU项目的官方网站上下载并安装,也可以运行以下命令来安装GDB调试器:
sudo apt install gdb
这将下载并安装GDB及其相关的依赖项。
-
编译可执行文件:GDB是用于调试可执行文件的工具,因此你需要先编译你的程序,并生成可执行文件。你可以使用适合你的编程语言的编译器来完成这个步骤。
-
了解编译选项:为了能够在GDB中正确地调试你的程序,你需要使用适当的编译选项来生成可调试的可执行文件。对于大多数编译器,你可以使用
-g
选项来生成调试信息。例如,对于GCC编译器,你可以使用以下命令来编译带有调试信息的可执行文件:$ gcc -g your_program.c -o your_program
这将生成一个名为
your_program
的可执行文件,其中包含调试信息,可以在GDB中使用。
2.经常使用的命令
-
run
:运行程序。 -
break
:设置断点。例如,break main
在程序的main
函数处设置断点。 -
next
:执行下一行代码。 -
step
:进入函数调用并逐行执行函数内部的代码。 -
continue
:继续执行程序,直到下一个断点或程序结束。 -
print
:打印变量的值。例如,print x
将打印变量x
的值。 -
backtrace
:查看调用栈,即程序执行到当前位置的函数调用序列。 -
set
:修改变量的值。例如,set x = 10
将把变量x
的值设置为10。 -
watch
:监视表达式的值。当表达式的值发生变化时,程序会暂停执行并显示相关信息。 -
info breakpoints
:查看当前设置的断点信息。 -
delete
:删除断点。例如,delete 1
将删除编号为1的断点。 -
quit
:退出GDB调试器。 -
info locals
:查看当前函数的局部变量。 -
info registers
:查看CPU寄存器的值。 -
display
:设置自动显示变量的值。例如,display x
将在每次程序暂停时显示变量x
的值。 -
finish
:执行当前函数的剩余部分,并返回到调用该函数的地方。 -
up
:在调用栈中向上移动一帧,查看调用当前函数的上一层函数。 -
down
:在调用栈中向下移动一帧,返回到当前函数调用的函数。 -
info threads
:查看程序中的线程信息。 -
thread <thread-id>
:切换到指定的线程。 -
set pagination off
:关闭分页功能,以便在显示大量输出时不会暂停。 -
record
:启用记录功能,可以回放程序的执行过程。 -
info functions
:列出程序中定义的所有函数。 -
info sources
:显示当前已加载的源文件列表。 -
run <arguments>
:运行程序并传递命令行参数。 -
set args <arguments>
:设置程序运行时的命令行参数。 -
set environment <variable=value>
:设置程序运行时的环境变量。 -
display /f <format> <expression>
:以指定的格式显示表达式的值。例如,display /x $eax
以十六进制格式显示$eax
寄存器的值。 -
info break
:显示所有断点的信息,包括编号、位置和条件。 -
disable <breakpoint-number>
:禁用指定编号的断点。 -
enable <breakpoint-number>
:启用指定编号的断点。 -
catch <exception>
:捕捉指定的异常,当发生该异常时程序会暂停。 -
watch <expression>
:在表达式的值发生变化时暂停程序。 -
set logging on
:打开日志记录功能,将GDB会话输出保存到日志文件中。
3.使用小技巧
⭕你可以只输入命令的首字母来执行GDB调试器命令。GDB支持命令的缩写,只要输入命令的唯一识别首字母即可。例如,你可以输入b
代替break
,n
代替next
,s
代替step
等。这样可以更快地输入命令并提高你的工作效率。然而,如果有多个命令以相同的首字母开头,GDB可能无法确定你要执行的是哪个命令,此时你需要输入更多的字符以区分命令。
⭕当你在GDB调试器中按下回车键时,它会执行上一条命令。这对于重复执行相同的命令非常方便,特别是当你需要多次执行相同的调试操作时。只需按下回车键即可重复执行上一条命令,无需重新输入。这可以提高你的工作效率并简化调试过程。
三、项目自动化构建工具 - make/Makefile
1. make命令
make
是一个常用的构建工具,它在Linux系统中广泛使用。它的主要功能是根据指定的规则和依赖关系自动化构建和编译工程项目。
⭕语法
make
命令的基本语法:
make [选项] [目标]
⭕常用选项
-f <文件>
或--file=<文件>
:指定使用的makefile
文件,默认为Makefile
。-C <目录>
或--directory=<目录>
:切换到指定的目录后执行make
命令。-n
或--just-print
:仅打印出要执行的命令而不实际执行。-B
或--always-make
:无条件重新构建所有目标。-j <并行数>
或--jobs=<并行数>
:指定并行执行的任务数。
⭕常用操作
make
:使用默认的makefile
文件执行构建,默认构建第一个目标。make <目标>
:指定构建的目标。make clean
:清理构建产生的中间文件和目标文件。make install
:安装构建生成的文件到系统目录。make distclean
:执行完全清理,将构建的文件和中间文件都删除。
⭕make命令的工作原理
make
命令会检查makefile
文件,找到要构建的目标及其依赖关系。- 如果目标不存在或比其依赖项的修改时间要旧,则需要重新构建该目标。
- 根据
makefile
文件中定义的规则和命令,执行构建操作。
⭕make命令的优势:
- 自动化构建:根据规则和依赖关系,只编译需要更新的文件,提高构建效率。
- 并行构建:使用
-j
选项可以指定并行执行的任务数,加快构建速度。 - 依赖关系管理:通过定义依赖关系,确保被修改的文件及其相关文件被正确地重新构建。
2.Makefile文件
Makefile
是一种用于构建和管理项目的配置文件,在Linux系统中广泛使用。它定义了项目中的目标、依赖关系以及构建命令等信息。
⭕Makefile的基本结构
一个典型的Makefile
文件包含了一系列规则和命令,每个规则由以下几个部分组成:
<目标>: <依赖关系><命令1><命令2>...
<目标>
:表示需要构建的文件或目标。它可以是一个可执行文件、库文件、中间文件等。Makefile
中可以定义多个目标,每个目标对应一个规则。<依赖关系>
:表示目标所依赖的文件或其他目标。当依赖关系中的文件被修改时,相关的目标需要被重新构建。<命令>
:构建目标所执行的命令。可以是编译源代码、链接、复制文件等操作。
⭕Makefile文件中常用的指令和语法
$(变量名)
:使用变量。可以定义和使用变量来简化Makefile
中的重复代码。=或:=
:变量赋值。使用=
表示简单赋值,使用:=
表示延迟赋值(变量的值在首次使用时确定,之后不再改变)。#
:注释符号,用于注释说明。@
:静默模式。在命令前添加@
符号,表示执行命令时不打印命令本身。if...endif
:条件判断语句。根据条件判断是否执行命令。for...endfor
:循环语句。可以遍历列表中的元素执行命令。
Makefile
文件中常用的内置变量:
CC
:C 编译器的名称。默认为cc
。CFLAGS
:C 编译器的选项。如-Wall
表示打开所有警告。LDFLAGS
:链接器的选项。如-lm
表示链接数学库。CPPFLAGS
:预处理器的选项。如-I
添加头文件搜索路径。
⭕Makefile的约定和惯例
clean
:一般会定义一个clean
目标,用于清理生成的目标文件和中间文件。all
:一般会定义一个all
目标,用于构建项目的所有目标。.PHONY
:声明一些伪目标,表示目标不对应任何实际的文件。常用于定义用于执行命令而非产生具体文件的目标。
⭕Makefile的工作原理
- 当执行
make
命令时,它会读取当前目录下的Makefile
文件。 Makefile
文件中定义的依赖关系和构建规则会被解析,并根据修改时间和依赖关系确定需要重新构建的目标。- 根据规则执行构建命令,生成目标文件。
✅这里给出一个简单的例子来说明Makefile
的使用。假设我们有一个 C 语言项目,包含两个源文件:main.c
和 helper.c
,它们需要分别编译成目标文件,并链接为可执行文件。
在这个例子中,我们首先定义了变量 CC
和 CFLAGS
,分别表示使用的 C 编译器和编译器选项。
然后,我们定义了默认的构建目标 all
,它依赖于目标文件 myapp
。
myapp
目标表示生成可执行文件myapp
,它依赖于对象文件 main.o
和 helper.o
。该规则包含了链接命令,将这两个目标文件链接为可执行文件。
main.o
和 helper.o
目标分别表示编译 main.c
和 helper.c
,它们都依赖于对应的源文件。这些规则包含了编译命令,将源文件编译为目标文件。
最后,我们定义了一个 clean
目标,用于清理生成的可执行文件和目标文件。
使用 make
命令执行这个 Makefile
文件时,它会自动根据依赖关系进行构建。例如,如果修改了 main.c
,那么只会重新编译 main.o
和 myapp
,而不需要重新编译 helper.o
。
通过这样的 Makefile
文件,我们可以方便地构建和管理项目,简化了编译和链接操作。
总结
本文介绍了调试器和自动化构建工具的基本概念和使用方法。调试器是一种帮助程序员诊断和修复程序错误的工具,常用的调试器是GDB,它提供了设置断点、单步执行、查看变量值等功能。自动化构建工具是一种用于管理项目构建的工具,常用的工具是make,它通过makefile文件定义构建规则和依赖关系,可以自动化执行编译、链接等操作。通过使用调试器和自动化构建工具,程序员可以更高效地调试和构建项目,提高开发效率和代码质量。
温馨提示
感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!
再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
相关文章:

【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)
阅读导航 前言一、什么是调试器二、详解 GDB - 调试器1.使用前提2.经常使用的命令3.使用小技巧 三、项目自动化构建工具 - make/Makefile1. make命令⭕语法⭕常用选项⭕常用操作⭕make命令的工作原理⭕make命令的优势: 2.Makefile文件⭕Makefile的基本结构⭕Makefil…...

echarts-convert.js使用
echarts-convert.js demo 点击下载 1、本地安装phantom.js插件 window版本下载 2、更改文件路径 (D:\phantomjs-2.1.1-windows\bin)改为本地项目文件路径 3、打开cmd命令行,并格式化语言 运行以下命令 将命令行语言改为中文简体 chcp…...

数据结构之队列详解(包含例题)
一、队列的概念 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操…...

Prometheus的搭建与使用
一、安装Prometheus 官网下载地址:Download | Prometheus 解压:tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名: mv prometheus-2.19.2.linux-amd64 /home/prometheus进入对应目录: cd /home/prometheus查看配置文件&am…...

实战指南,SpringBoot + Mybatis 如何对接多数据源
系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难,MyBatis动态Sql标签解析 从零开始,手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 Spring监听器…...

论文阅读——Imperceptible Adversarial Attack via Invertible Neural Networks
Imperceptible Adversarial Attack via Invertible Neural Networks 作者:Zihan Chen, Ziyue Wang, Junjie Huang*, Wentao Zhao, Xiao Liu, Dejian Guan 解决的问题:虽然视觉不可感知性是对抗性示例的理想特性,但传统的对抗性攻击仍然会产…...

List和ObservableCollection和ListBinding在MVVM模式下的对比
List和ObservableCollection和ListBinding在MVVM模式下的对比 List 当对List进行增删操作后,并不会对View进行通知。 //Employee public class Employee : INotifyPropertyChanged {public event PropertyChangedEventHandler? PropertyChanged;public string N…...

insightface安装过程中提示 Microsoft Visual C++ 14.0 or greater is required.
pip install insightface安装过程中提示 Microsoft Visual C 14.0 or greater is required.Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 根据提示网站访问官网下载生成工具 打开软件后会自动更新环境&#…...

mongodb数据库
目录 一、数据库 二、文档 三、集合 四、元数据 五、MongoDB 数据类型 1、ObjectId 2、字符串 3、时间戳 4、日期 一、数据库 一个 mongodb 中可以建立多个数据库。 MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。 MongoDB 的单…...

OpenCV-Python中的图像处理-图像特征
OpenCV-Python中的图像处理-图像特征 图像特征Harris角点检测亚像素级精度的角点检测Shi-Tomasi角点检测SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features)FAST算法BRIEF(Binary Robust Independent Elementary Features)算法ORB (Oriented FAST and R…...

Ajax入门+aixos+HTTP协议
一.Ajax入门 概念:AJAX是浏览器与服务器进行数据通信的技术 axios使用: 引入axios.js使用axios函数:传入配置对象,再用.then回调函数接受结果,并做后续处理 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>01.axios使用…...

conda创建虚拟环境
创建虚拟环境是在计算机上设置一个独立的空间,用于安装和运行特定版本的软件和依赖项,以避免与系统其他部分的冲突。 创建虚拟环境: conda create --name myenv python3.8 这将创建一个名为myenv的虚拟环境,并安装Python 3.8版本。…...

Golang服务的请求调度
文章目录 1. 写在前面2. SheddingHandler的实现原理3. 相关方案的对比4. 小结 1. 写在前面 最近在看相关的Go服务的请求调度的时候,发现在gin中默认提供的中间件中,不含有请求调度相关的逻辑中间件,去github查看了一些服务框架,发…...

Jenkins的流水线启动jar后未执行问题处理
现象 在流水线里配置了启动脚本例如,nohup java -jar xxx.jar >nohup.out 2>&1 & 但是在服务器发现服务并未启动,且nohup日志里没输出日志,这样的原因是jenkins在执行完脚本后,就退出了这个进程。 在启动脚本执行jar命令的上一步加入以下…...

智慧工地平台工地人员管理系统 可视化大数据智能云平台源码
智慧工地概述: 智慧工地管理平台是以物联网、移动互联网技术为基础,充分应用大数据、人工智能、移动通讯、云计算等信息技术,利用前端信息采通过人机交互、感知、决策、执行和反馈等,实现对工程项目內人员、车辆、安全、设备、材…...

外包干了2个月测试,技术退步明显...
先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

神经网络基础-神经网络补充概念-19-向量化实现的解释
概念 向量化是一种优化技术,通过使用数组操作代替显式的循环,可以大大提高代码的性能和效率。在机器学习和数据分析领域,向量化是一种常见的实践,它允许你在处理大量数据时更快地进行计算。 一般操作 数组操作:向量…...

四层和七层负载均衡的区别
一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机,它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例,负载均衡器在接收到第一个来…...

Scala 如何调试隐式转换--隐式转换代码的显示展示
方法1 在需要隐式转换的地方,把需要的参数显示的写出。 略方法2,查看编译代码 在terminal中 利用 scalac -Xprint:typer xxx.scala方法打印添加了隐式值的代码示例。 对于复杂的工程来说,直接跑到terminal执行 scalac -Xprint:typer xxx.…...

Rust交叉编译简述 —— Arm
使用系统:WSL2 —— Kali(Microsoft Store) 命令列表 rustup target list # 当前官方支持的构建目标架构列表 rustup target add aarch64-unknown-linux-gnu # 添加目标架构sudo apt-get install gcc-13-aarch64-linux-gnu gcc-13-aarch64-linux-gnu # 下载目标工具…...

算法与数据结构(二十三)动态规划设计:最长递增子序列
注:此文只在个人总结 labuladong 动态规划框架,仅限于学习交流,版权归原作者所有; 也许有读者看了前文 动态规划详解,学会了动态规划的套路:找到了问题的「状态」,明确了 dp 数组/函数的含义&a…...

相机的位姿在地固坐标系ECEF和ENU坐标系的转换
在地球科学和导航领域,通常使用地心地固坐标系(ECEF,Earth-Centered, Earth-Fixed)和东北天坐标系(ENU,East-North-Up)来描述地球上的位置和姿态。如下图所示: 地心地固坐标ecef和…...

RFID技术助力汽车零配件装配产线,提升效率与准确性
随着科技的不断发展,越来越多的自动化设备被应用到汽车零配件装配产线中。其中,射频识别(Radio Frequency Identification,简称RFID)技术凭借其独特的优势,已经成为了这一领域的重要技术之一。本文将介绍RF…...

应用高分辨率 GAN 对扰动文档图像去扭曲的深度Python实践
1. 引言 随着技术的不断发展,图像处理在各种场景中的应用也变得越来越广泛。高分辨率 GAN (Generative Adversarial Network) 是近年来图像处理领域的热点技术,它能够生成极高分辨率的图像,与此同时,它也可以用于各种修复和增强任…...

【BASH】回顾与知识点梳理(二十六)
【BASH】回顾与知识点梳理 二十六 二十六. 二十一至二十五章知识点总结及练习26.1 总结26.2 模拟26.3 简答题 该系列目录 --> 【BASH】回顾与知识点梳理(目录) 二十六. 二十一至二十五章知识点总结及练习 26.1 总结 Linux 操作系统上面,…...

React下载文件的两种方式
React下载文件的两种方式 - 代码先锋网 不知道有用没用看着挺整齐 没试过 1、GET类型下载 download url > {const eleLink document.createElement(a);eleLink.style.display none;// eleLink.target "_blank"eleLink.href url;// eleLink.href record;d…...

python入门知识:分支结构
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 1.内容导图 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python资料、视频教程、代码、插件安装教程等我都准备好了,直接在文末名片自…...

DNS协议及其工作原理
DNS是域名系统(Domain Name System)的缩写,它是一种用于将域名转换为IP地址的分布式数据库系统。它是因特网的基石,能够使人们通过域名方便地访问互联网,而无需记住复杂的IP地址。 DNS的历史可以追溯到1983年…...

调用被fishhook的原函数
OC类如果通过runtime被hook了,可以通过逆序遍历方法列表的方式调用原方法。 那系统库的C函数被fish hook了该怎么办呢? 原理和OC类异曲同工,即通过系统函数dlopen()获取动态库,以动态库为参数通过系统函数dlsym()即可获取目标系统…...

java语言B/S架构云HIS医院信息系统源码【springboot】
医院云HIS全称为基于云计算的医疗卫生信息系统( Cloud- Based Healthcare Information System),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、…...