当前位置: 首页 > news >正文

Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

gdb、make/Makefile

  • 引言
  • 调试器gdb
    • 介绍
    • 常用指令
  • 自动化构建工具make/Makefile
    • 介绍
    • 使用
      • 依赖关系与依赖方法
      • 编辑Makefile
      • 伪目标
  • 总结

引言

在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g++:
戳我看vim与gcc详解哦

在本篇文章中将继续来介绍Linux中的工具:调试器gdb与项目自动化构建工具make/Makefile

调试器gdb

介绍

在Windows环境中,我们使用vs时,常常会逐过程与逐语句地调试代码以更高效地寻找到错误的位置。在Linux中也有其调试器,即gdb

前面我们应该知道,程序的发布版本有两种,即调试版本Debug与发布版本Release。Debug版本中包含有调试信息,所以可以支持调试;而Release版本中不包含调试信息,同时还进行了一些优化。
在vs中我们可以调整发布版本:
在这里插入图片描述
在Linux中默认的发布版本为Release版本,无法直接进行调试,需要以Debug版本发布才可以:
使用 gcc 原文件 -o 可执行文件 -g 就可以实现按照Dubeg版本发布
在这里插入图片描述
显然,Release版本比ebug版本多占一些空间,即调试信息所占的空间。

常用指令

为方便展示,使用vim编辑一段代码:
在这里插入图片描述

  1. gdb 可执行程序名进入调试环境
    在这里插入图片描述

  2. list/l 行号:从某行开始显示源代码,不加行号默认从第一行开始显示,连续l接着上次的位置往下列(可以直接回车默认输入上次的指令),每次列10行:
    在这里插入图片描述

  3. list/l 函数名:列出某个函数的源代码,其实就是从某个函数开始显示10行代码,也可以继续向下显示:
    在这里插入图片描述

  4. r/run:运行程序,就相当于我们vs环境中调试时的f5,从头开始执行程序,遇到断点会停止运行:
    continue / c:从当前位置开始连续执行程序,遇到断点会停止运行
    在这里插入图片描述

  5. break/b 行号:在某一行设置断点
    设置断点后,再r运行程序时就会在断点处停下:
    在这里插入图片描述

  6. break/b 函数名:在某个函数开头设置断点
    设置后断点的行数为函数的第一行代码:
    在这里插入图片描述

  7. info/i break/b :查看断点信息
    在这里插入图片描述

  8. delete breakpoints n / d n:删除序号为n的断点
    在这里插入图片描述

  9. delete breakpoints / d:删除所有断点
    在这里插入图片描述

  10. disable breakpoints:禁用断点
    断点在禁用后,断点会继续保留,但是在运行时并不会在该断点处停止:
    在这里插入图片描述

  11. enable breakpoints:启用断点
    在这里插入图片描述

  12. n / next:逐过程执行
    相当于vs环境中的f10,即不进入函数,逐过程执行。在执行时会显示当前执行的语句,返回值:
    (在使用逐过程逐语句执行时,首先需要r运行起来,从断点处开始执行)
    在这里插入图片描述

  13. s / step:逐语句执行
    相当于vs环境中的f11,即进入函数,逐语句执行。在执行时会显示当前执行的语句,返回值:
    在这里插入图片描述

  14. finish:执行到当前函数返回,然后停下来等待命令
    有时候在进入函数后,其中的代码过于繁琐,这时再逐过程的执行到结束就会很麻烦,所以finish就可以直接执行到函数结束:
    假设存在一函数func
    在这里插入图片描述
    在进入这个函数后就可以finish到函数结束:
    在这里插入图片描述

  15. p 变量名:打印变量值
    在这里插入图片描述

  16. set var 变量名 = val:修改变量的值
    在这里插入图片描述

  17. display 变量名:跟踪查看一个变量,每次停下来都显示它的值
    跟踪显示变量时,也是有序号的。
    在这里插入图片描述

  18. undisplay 序号:取消对变量的跟踪显示
    通过序号取消跟踪:
    在这里插入图片描述

  19. until X行号:运行至X行
    在这里插入图片描述

  20. quit/ q:退出gdb
    在这里插入图片描述

自动化构建工具make/Makefile

介绍

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作;
makefile带来的好处就是自动化编译,我们写好之后,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,能够解释makefile中指令。一般来说,大多数的IDE(集成开发环境)都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

在使用make命令后,会在当前工作目录下寻找makefile文件并进行自动的解释构建

使用

依赖关系与依赖方法

我们在通过原文件生成目标文件时,目标文件需要依赖原文件在可以产生,没有原文件就没有目标文件,这就是依赖关系;而如何通过原文件生成目标文件的方法即依赖方法

例如我们有头文件test.h与源文件test.c,要生成一个可执行文件test其中test依赖test.htest.c就是依赖关系,gcc test.h test.c -o test 就是对应的依赖方法

编辑Makefile

寻找逻辑

  1. make在当前工作目录下找到makefile / Makefile文件后 ,会找到其开始的第一个文件为目标文件
  2. 如果目标文件不存在,或是其所依赖原文件的文件修改时间要比目标文件新,就会执行后面所定义的命令(依赖方法)来生成目标文件;
  3. 如果目标文件所依赖的原文件不存在,那么make会在Makefile中继续寻找目标为该原文件的依赖关系与依赖方法,以生成该文件;
  4. make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件
  5. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。

所以在编辑Makefile时,首先就要写出目标文件及其依赖文件

test: test.c test.h

然后在其下一行写出其依赖方法,需要注意的是,依赖方法前的空格必须为Tab,否则会报错:
(在书写时,简便起见,所有目标文件可以用 $@ 表示,所有依赖文件可以用 $^表示)

	gcc -o $@ $^ -std=c99

在这里插入图片描述

到现在,我们的Makefile就可以简单进行使用了(这里有一个简单的for循环来测试):
在这里插入图片描述

伪目标

make在使用时,当目标文件已经存在,且其最新修改时间比其依赖文件晚的话,连续make是不会生成多个目标文件的
在这里插入图片描述
伪目标是可以总是被执行的,即任何时候想要执行都是可以的,.PHNOY修饰

生成的工程是需要被清理的,但是清理操作显然不能因为该目标文件已存在就不执行。所以clean这样的目标文件就可以被声明成伪目标(clean这个目标文件不需要依赖文件,只需要借助它来执行其下的删除指令即可):

.PHNOY: clean    //声明伪目标文件
clean:           //依赖关系(无依赖文件)rm -f test //依赖方法

在这里插入图片描述
有了伪目标后,就可以随时清理程序了。需要make clean命令
在这里插入图片描述

总结

到此,关于Linux工具的基本知识就全部介绍完了

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

相关文章:

Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

gdb、make/Makefile 引言调试器gdb介绍常用指令 自动化构建工具make/Makefile介绍使用依赖关系与依赖方法编辑Makefile伪目标 总结 引言 在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g: 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具&…...

C++ 网络编程项目fastDFS分布式文件系统(三)-Nginx部分

目录 1. 一些基本概念 1.1 Nginx初步认识 1.2 正向/反向代理 1.3 域名和IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 4 课外知识导读 1. URL和URI ​编辑 2. DNS解析过程 1. 一些基本概念 1.1 Nginx初步认…...

Apache-DBUtils

目录 封装方法 引出dbutils 案例 当关闭connection后,resultset结果集就无法使用了,这就使得resultset不利于数据的管理 封装方法 我们可以将结果集先存储在一个集合中,当connection关闭后,我们可以通过访问集合来访问结果集 …...

LangChain手记 Agent 智能体

整理并翻译自DeepLearning.AILangChain的官方课程:Agent(源代码可见) “人们有时会将LLM看作是知识库,因为它被训练所以记住了来自互联网或其他地方的海量信息,因而当你向它提问时,它可以回答你的问题。有一…...

87-基于stm32单片机粮仓仓库环境温湿度烟雾监测报警系统Proteus仿真+源码

资料编号:087 一:功能介绍: 1、采用stm32单片机OLED显示屏烟雾浓度检测DHT11温湿度电机按键蜂鸣器,制作一个温湿度采集、烟雾浓度采集,OLED显示相关数据, 2、通过按键设置温度上限、烟雾浓度上限&#xff0…...

ChatGPT 调教日记(二):程序员转量化的背景知识

程序员如何学习量化金融 作为一个程序员学习量化金融(quant)是一个不错的选择。以下是一些建议: 学习金融基础知识:了解金融市场、投资策略和金融产品。这将帮助你理解量化金融的背景和应用场景。 学习统计学和数学:…...

什么是网络地址转换 (NAT)

网络地址转换(NAT)是更改源和目标 IP 地址和端口的过程,地址转换减少了对 IPv4 公共地址的需求,并隐藏了专用网络地址范围,该过程通常由路由器或防火墙完成。 NAT是如何工作的 NAT 允许单个设备(如路由器…...

系统架构设计师---事务管理、并发控制、数据库的备份与恢复

目录 事务管理 定义 事务的四个特性(ACID) 相关SQL语句 并发控制...

如何更好的维护自己的电脑?

我的笔记本电脑 我使用的华硕天选3是一款游戏本,搭载了英特尔酷睿i7-12700H处理器,16GB内存,512GB固态硬盘和NVIDIA GeForce RTX 3050显卡。屏幕尺寸为15.6英寸,分辨率为2560x1440。对于日常使用和工作学习娱乐都能满足要求。 日常…...

element+vue 表格行拖拽功能

解决方案 使用 sortable.js 步骤一&#xff1a; 安装 npm install vuedraggable步骤二&#xff1a;引入 import Sortable from sortablejs;步骤三&#xff1a; el-table 添加row-key属性&#xff0c;外层包一层 sortableDiv <div class"sortableDiv"> 拖…...

Python学习笔记_基础篇(三)_数据类型之列表

一.基本数据类型 整数&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一个tab键) 布尔值&#xff1a; bool 列表&#xff1a;list &#xff08;元素的集合&#xff09; 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&a…...

目标检测YOLO实战应用案例100讲-交通目标检测中传感器数据采集容错控制方法

目录 前言 交通传感器数据采集相关理论基础 2.1交通目标检测系统数据采集简介...

ElasticSearch 8.9.0 开发模式安装

ElasticSearch 8.9.0 开发模式安装 MacOS&#xff08;Apple芯片&#xff09;&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.9.0-darwin-aarch64.tar.gz Linux&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasti…...

docker部署redis

这里写目录标题 1.安装Redis2.新建挂载文件夹3.配置redis4.创建redis容器&#xff0c;挂载启动命令连接测试 Docker停止、删除、重启、启动容器 1.安装Redis 通过docker search redis和docker pull redis下载redis镜像 2.新建挂载文件夹 新建data和conf两个文件夹&#xff0…...

ZooKeeper的应用场景(分布式锁、分布式队列)

7 分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要通过一些互斥手段来防止彼此之间的干扰&#xff0c;以保证一致性&#xff0c;…...

seata 的部署和集成

文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos…...

C++入门基础(万字详解!!!)

文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结…...

神经网络基础-神经网络补充概念-53-将batch norm拟合进神经网络

代码实现 import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization, Activation from tensorflow.keras.optimizers import SGD# 生成随机数据 np.random.seed(0) X np.…...

Sping源码(六)— prepareBeanFactory()

前言 前几篇已经介绍lBeanFactory的创建已经xml配置文件中自定义标签和默认标签的解析过程&#xff0c;此时的BeanFactory中已经包含了xml文件中的标签属性。但BeanFactory中还有一些本身重要的属性没有填充&#xff0c;所以接着方法继续往下看BeanFactory中的属性是如何填充的…...

LeetCode(力扣)257. 二叉树的所有路径Python

LeetCode257. 二叉树的所有路径 题目链接代码 题目链接 https://leetcode.cn/problems/binary-tree-paths/ 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...