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

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

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

希望与大家共同进步哦

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js ajax 国内快速 映像

ajax 快速 映像 https://www.bootcdn.cn/ axios入门和axios基本请求方式 https://blog.csdn.net/m0_68997646/article/details/127438174 使用 jsDelivr CDN: <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>因为我们国…

【Linux命令详解 | ssh命令】 ssh命令用于远程登录到其他计算机,实现安全的远程管理

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 连接远程服务器2. 使用SSH密钥登录2.1 生成密钥对2.2 将公钥复制到远程服务器 3. 端口转发3.1 本地端口转发3.2 远程端口转发 4. X11转发5. 文件传输与远程命令执行5.1 文件传输5.1.1 从本地向远程传输文件5.1.2 …

vue使用jsplumb 流程图

安装jsPlumb库&#xff1a;在Vue项目中使用npm或yarn安装jsPlumb库。 npm install jsplumb 创建一个Vue组件&#xff1a;创建一个Vue组件来容纳jsPlumb的功能和呈现。 <template><div style"margin: 20px"><div style"margin: 20px">&l…

图数据库_Neo4j和SpringBoot整合使用_创建节点_删除节点_创建关系_使用CQL操作图谱---Neo4j图数据库工作笔记0009

首先需要引入依赖 springboot提供了一个spring data neo4j来操作 neo4j 可以看到它的架构 这个是下载下来的jar包来看看 有很多cypher对吧 可以看到就是通过封装的驱动来操作graph database 然后开始弄一下 首先添加依赖

Python爬虫性能优化:多进程协程提速实践指南

各位大佬们我又回来了&#xff0c;今天我们来聊聊如何通过多进程和协程来优化Python爬虫的性能&#xff0c;让我们的爬虫程序6到飞起&#xff01;我将会提供一些实用的解决方案&#xff0c;让你的爬虫速度提升到新的高度&#xff01; 1、多进程提速 首先&#xff0c;让我们来看…

视频汇聚集中存储EasyCVR平台调用iframe地址视频无法播放,该如何解决?

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝…

Java算法_ 检查对称树(LeetCode_Hot100)

题目描述&#xff1a;给你一个二叉树的根节点 &#xff0c; 检查它是否轴对称。root 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/8/17 8:47* 4*/ public class SymmetricTree {static class…

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外&#xff0c;编程语言中还会大量使用比较运算&#xff0c;并会根据比较运算的结果是“真”还是“假”&#xff0c;来执行不同的代码。 当你想买一杯奶茶&#xff0c;准备支付的时候&#xff0c;支…

VisualStudio打包项目文件为.exe安装包

前言&#xff1a; 使用扩展&#xff1a;install Projects 注意事项&#xff1a;打包项目前&#xff0c;确保项目能正常运行&#xff0c;不然打包毫无意义。 一、安装扩展 打开vs软件->扩展->管理扩展->搜索install Projects->安装->重启软件 二、制作安装包&a…

【uni-app报错】获取用户收货地址uni.chooseAddress()报错问题

chooseAddress:fail the api need to be declared in …e requiredPrivateInf 原因&#xff1a; 小程序配置 / 全局配置 (qq.com) 解决&#xff1a; 登录小程序后台申请接口 按照流程申请即可 在项目根目录中找到 manifest.json 文件&#xff0c;在左侧导航栏选择源码视图&a…

postgresql 分组

postgresql 数据汇总 分组汇总聚合函数注意 总结 分组统计总结 高级分组总结 分组汇总 聚合函数 聚合函数&#xff08;aggregate function&#xff09;针对一组数据行进行运算&#xff0c;并且返回单个结果。PostgreSQL 支持以下常见的聚合函数&#xff1a; • AVG - 计算一…

小程序swiper一个轮播显示一个半内容且实现无缝滚动

效果图&#xff1a; wxml&#xff08;无缝滚动&#xff1a;circular"true"&#xff09;&#xff1a; <!--components/tool_version/tool_version.wxml--> <view class"tool-version"><swiper class"tool-version-swiper" circul…

树莓派+WordPress:打造专属博客,内网穿透轻松发布到公网!

概述 在本次教程里&#xff0c;我们将在树莓派上搭建一个Wordpress博客站点&#xff0c;开始博客时代&#xff0c;记录生活点滴。同时做内网穿透将博客发布上线&#xff0c;让互联网用户都可以访问到&#xff0c;无需公网ip&#xff0c;也无需购买云服务器&#xff0c;简单快速…

【系统架构设计专业技能 · 软件工程之系统分析与设计(二)【系统架构设计师】

系列文章目录 系统架构设计专业技能 软件工程&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;…

【【STM32----I2C通信协议】】

STM32----I2C通信协议 我们会发现I2C有两根通信线&#xff1a; SCL和SDA 同步 半双工 带数据应答 支持总线挂载多设备&#xff08;一主多从&#xff0c;多主多从&#xff09; 硬件电路 所有I2C设备的SCL连在一起&#xff0c;SDA连在一起 设备的SCL和SDA均要配置成开漏输出模式 …

msvcr120.dll丢失怎么修复,介绍几种最简单的修复方法

当您在运行某个程序时遇到msvcr120.dll丢失的错误提示时&#xff0c;可能无法正常启动或执行该程序。msvcr120.dll是Microsoft Visual C Redistributable中的一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是一种运行时库&#xff08;Runtime Library&#xff0…

VMWARE15.5.7安装RedHat 7.9黑屏

在win7上面最高版本为vmware15.5.7 我安装后&#xff0c;安装成功了redhat5.5 但是因为操作系统有点老。安装其他软件时遇到问题。想改为7.0以上linux。 但是遇到了问题。安装时&#xff0c;一直黑屏。包括再安装5.5也是同样效果。 找了很多方案都无济于事。后面搜到一个方案…

自动驾驶,一次道阻且长的远征|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在6月的世界人工智能大会上&#xff0c;马斯克在致辞中宣称&#xff0c;到2023年底&#xff0c;特斯拉便可实现L4级或L5级的完全自动驾驶&#xff08;FSD&#xff09;。两个月之后&#xff0c;马斯克又在X社交平台上发言&am…

Unity自定义脚本的 初始模版

参考博主&#xff1a;Unity修改创建的脚本模板&#xff0c;Unity脚本模板路径_unity hub 怎么改脚本模板_先生沉默先的博客-CSDN博客 【100个 Unity实用技能】 ☀️ | Unity自定义脚本的初始模版_unity 模板脚本_呆呆敲代码的小Y的博客-CSDN博客 一&#xff0c;将脚本放到Ed…

Linux debian12解压和压缩.rar文件教程

一、Debian12安装rar命令 sudo apt install rar二、使用rar软件 1.解压文件 命令格式&#xff1a; rar x 文件名.rar实力测试&#xff1a; [rootdoudou tmp]# rar x test.rar2.压缩文件 test是一个文件夹 命令格式&#xff1a; rar a 文件名.rar 文件夹名实例测试&#x…