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工具的基本知识就全部介绍完了

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

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

希望与大家共同进步哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/88049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ResNet18云空间部署

1-6步骤可以在云空间运行,也可以在本地运行;步骤7 在云空间运行。 1.编译ONNX模型 本章以 resnet18.onnx 为例, 介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。 该模型来自onnx的官网: models/vision/classification/resnet/model/resnet18-v1…

Mybatis (3)-----分页的运用

目录 一、分页查询 二,特殊的字符处理 三、总结 前言:在我们上篇已经学的动态sql的基础上,今天继续讲解关于maybatis的分页,特殊的字符处理。希望这篇博客可以帮助到大家哦! 一、分页查询 为什么要重写mybatis的分…

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了,现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里,我们的小蜜蜂既然是一只猫,那么放出的子弹…

【MD5加密】

MD5加密 什么是MD5密码MD5用途MD5特点MD5加密MD5解密总结那我们上面也已经提到啦,说MD5是可以进行解密或者说他是可以泄露密码等,所以我们还可以使用以下方法进行再次加密 第一种:MD5固定盐值第二种:MD5随机盐值 什么是MD5密码 官…

基于鸽群算法优化的BP神经网络(预测应用) - 附代码

基于鸽群算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于鸽群算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.鸽群优化BP神经网络2.1 BP神经网络参数设置2.2 鸽群算法应用 4.测试结果:5.Matlab代码 摘要…

25-非父子通信 - event bus 事件总线

作用:非父子组件之间,进行简易消息传递。(复杂场景 -> Vuex) 1.创建一个都能访问到的事件总线(空 Vue 实例) -> utils/EventBus.js import Vue from vue const Bus new Vue() export default Bus 2. A组件(接收方),监听 Bus实例 的事件(支持多个组件同时监…

机器人制作开源方案 | 滑板助力器

我们可以用一块废滑板做些什么呢? 如今,越来越多的人选择电动滑板作为代步工具或娱乐方式,市场上也涌现出越来越多的电动滑板产品。 (图片来源:Backfire Zealot X Belt Drive Electric Skateboard– Backfire Board…

在Linux系统上安装和配置Redis数据库,无需公网IP即可实现远程连接的详细解析

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 Redis作为一款高速缓存的key value键值对的数据库,在…

学会Mybatis框架:一文掌握MyBatis与GitHub插件分页的完美结合【三.分页】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Mybatis分页 1. Mybatis自带分页 2…

springboot小知识:配置feign服务超时时间

背景:当前项目通过feign服务调用了其他两个项目的接口,但是由于特殊需求,需要调整某一个项目的feign服务的默认超时时间: 默认连接超时10秒,默认读取超时时间 60秒 1.找到定义的FeignClient 2.根据FeignClient定义的名…

Node基础--Node简介以及安装教程

1.Node简介 Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Pe…

对CSV格式的数据文件进行插值处理

使用Python程序,实现对一个较短的csv文件,进行差值处理,并绘制GUI界面; 这个程序是一个使用Python的Tkinter库构建的GUI应用程序,用于对CSV格式的数据文件进行插值处理。下面我会逐步解释程序的各个部分和功能&#x…

消息队列前世今生 字节跳动 Kafka #创作活动

消息队列前世今生 1.1 案例一: 系统崩溃 首先大家跟着我想象一下下面的这个的场景, 看到新出的游戏机,太贵了买不起,这个时候你突然想到,今天抖音直播搞活动,打开抖音搜索,找到直播间以后&am…

边缘计算节点BEC典型实践:如何快速上手PC-Farm服务器?

百度智能云边缘计算节点BEC(Baidu Edge Computing)基于运营商边缘节点和网络构建,一站式提供靠近终端用户的弹性计算资源。边缘计算节点在海外覆盖五大洲,在国内覆盖全国七大区、三大运营商。BEC通过就近计算和处理,大…

并发编程系列-分而治之思想Forkjoin

我们介绍过一些有关并发编程的工具和概念,包括线程池、Future、CompletableFuture和CompletionService。如果仔细观察,你会发现这些工具实际上是帮助我们从任务的角度来解决并发问题的,而不是让我们陷入线程之间如何协作的繁琐细节&#xff0…

一网打尽java注解-克隆-面向对象设计原则-设计模式

文章目录 注解内置注解元注解 对象克隆为什么要克隆?如何克隆浅克隆深克隆 Java设计模式什么是设计模式?为什么要学习设计模式? 建模语言类接口类之间的关系依赖关系关联关系聚合关系组合关系继承关系实现关系 面向对象设计原则单一职责开闭原…

仓库使用综合练习

目录 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。 4、Dockerfile快速搭建自己专属的LAMP环境,生…

跨平台图表:ChartDirector for .NET 7.1 Crack

什么是新的 ChartDirector for .NET 7.0 支持跨平台使用,但仅限于 .NET 6。这是因为在 .NET 7 中,Microsoft 停止了用于非 Windows 使用的 .NET 图形库 System.Drawing.Common。由于 ChartDirector for .NET 7.0 依赖于该库,因此它不再支持 .…

小白到运维工程师自学之路 第七十九集 (基于Jenkins自动打包并部署Tomcat环境)1

一、传统的流程 1、传统网站部署的流程 在运维过程中,网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码-->内网部署-->内网测试-->确认上线-->备份数据-->外网更新-->外网测试--&g…

【ES6】—数组的扩展

一、类数组/ 伪数组 1. 类/伪数组: 并不是真正意义的数组,有长度的属性,但无法使用Array原型上的方法 let divs document.getElementsByTagName(div) console.log(divs) // HTMLCollection []let divs2 document.getElementsByClassName("xxx&q…