makefile与gdb的使用

news2024/10/11 22:21:47

✨前言✨

📘 博客主页:to Keep博客主页
🙆欢迎关注,👍点赞,📝留言评论
⏳首发时间:2024年10月11日
📨 博主码云地址:渣渣C
📕参考书籍:C语言程序与设计 和 数据结构(C语言版)
📢编程练习:牛客网+力扣网

Linux常用的两个工具

  • 1 make与makefile
    • 1.1 了解makefile
    • 1.2 ACM时间
  • 2 gdb调试工具的使用
    • 2.1 断点操作
    • 2.2 查看变量操作
    • 2.3 范围查找bug操作

1 make与makefile

1.1 了解makefile

首先我们必须明白的就是make是一个指令,makefile就是一个文件!makefile文件中主要包含的内容如下所示:
在这里插入图片描述
mybin被称为目标文件,也就是要生成的文件,code.c就是依赖文件列表,一般就是指的我们源文件,可以是多个源文件,这里只是以一个为例子!gcc这条语句就被叫做依赖方法!前面必须是一个TAB键开头!这样我们就简单的写好了一个makefile(m大小写都可以,这里就统一使用了小写)!我们保存之后,直接使用make指令就可以对该目录下的code.c这个源文件进行编译了!

在这里插入图片描述
在这里插入图片描述
果然就生成了mybin的可执行文件了!删除的话,我们在makefile文件中增加一个clean目标文件,该目标文件不依赖于任何的文件!
在这里插入图片描述
我们如何执行这个指令呢?我们不能直接使用make,而是要使用make clean才可以执行该指令!为什么直接生成mybin不用呢?事实上,使用make命令时,Linux会从上到下去扫描makefile文件,默认就会执行第一个依赖方法,也就是说就会自动生成第一个目标文件并且默认就只形成一个!
在这里插入图片描述

1.2 ACM时间

我们如果使用make指令之后在进行make,我们可以发现,依赖方法就不在执行了
在这里插入图片描述
在这里插入图片描述

我们先来介绍一下文件的三个时间,Access指的是最近查看文件的时间,这个时间并不是每查看一次就会立马更新,而是又自己的更新原则的!Change时间指的就是文件属性的改变时间,Modify就是文件内容修改的时间,所以通常Modify时间的改变也会引起Change时间的改变!我们在来说说,使用make指令时,系统就会将我们生成的目标文件的modify时间与依赖文件的Modify时间进行对比,如果我们目标文件的Modify时间比依赖文件的Modify时间要更新,那么此时就不用在编译,所以就不会在执行该方法!有没有什么办法可以让我们避免这种比较呢?makefile中就提供了.PHONY关键字(表示该目标是一个伪目标,可以总是被执行)来帮助我们!
在这里插入图片描述
在这里插入图片描述
当然了,对于make与makefile提供的这种比较当然是好的,有助于我们进行开发!.PHONY关键字的用法一般如下所示,将我们的clean作为一个伪目标:
在这里插入图片描述
makefile还可以用对变量进行定义,然后替换!$@表示就是目标文件, $^表示就是依赖文件列表,cc表示自定义变量
在这里插入图片描述

2 gdb调试工具的使用

我们需要先安装gdb调试工具(以centos 7为例)!安装命令如下:

yum install -y gdb

我们就可以使用gdb命令进入调试状态了!我们先创建一个code.c的文件,内容如下所示:
在这里插入图片描述
我们在编写一个makefile自动编译文件!内容如下:
在这里插入图片描述

然后我们利用make命令就可以编译生成对应的代码,我们使用gdb+编译好目标代码就可以进入gdb的调试环境!但是我们编译所生成的代码一定要是debug版本的,debug版本是带有调试信息的,适合我们开发人员进行调试,这样进入gdb环境下才可以进行调试,因为release版本是不可以进行调试的,不带调试信息的,所以适合测试人员进行测试!那么在Linux环境下,默认的编译方式是生成release版本的,如何让它生成debug版本的呢?我们只需要在makefile文件中做以下改动就可以了!
在这里插入图片描述
因此我们也可以总结出,gcc编译默认生成的就是release版本,是默认动态链接的!
下面我们就来简单的介绍一下,gdb中常见的调试命令(在gdb中,如果不输入指令,会默认在上一条指令执行完毕之后,在次执行该指令):

quit        ~~~~~~        //退出gdb调试环境
l+行号        ~~~~~~       //显示源文件(test.c)某行之后的代码

2.1 断点操作

b + 行号      ~~~~     //表示在第几行打断点了
info + b      ~~~~     //查看有哪几个断点

在这里插入图片描述
我们可以发现,在Linux中,断点是进行了标号的,那么如何删除断点呢?在Linux中,断点删除的指令如下所示:

d + 断点序号

在这里插入图片描述

我们还可以让断点失能,就是不起作用!相当于我们VS中禁用断点的功能!

disable + 断点序号      ~~~~     //禁用该断点
enable + 断点序号      ~~~~     //启用该断点

在这里插入图片描述

2.2 查看变量操作

查看变量操作之前,我们需要先了解两个指令先,一个就是我们的逐过程,一个就是我们的逐语句!

n      ~~~~     //逐过程
s      ~~~~     //逐语句

在这里插入图片描述
我们可以在上述代码中的第十七行打上一个断点,然后我们开始运行程序,先使用n然后重新运行程序使用s,这样我们就可以发现使用n就可以直接跳到下一句了,而使用s就会进入到函数内部!我们如何查看一个变量与变量的地址呢?所要用到的指令如下所示:

p + 变量      ~~~~     //使用该指令就是临时查看一下变量或者变量地址,不会一直显示的
display + 变量      ~~~~     //使用该指令就是查看一下变量或者变量地址,会一直显示的,并且也会随着程序的运行而发生变化
info display      ~~~~     //查看常显示的变量或地址列表
undisplay + 序号      ~~~~     //删除要常显示的变量与地址

在这里插入图片描述

2.3 范围查找bug操作

gdb本质就是为了帮助我们快速的找到程序所在的bug,然后我们在对bug进行修改!

c      ~~~~     //从一个断点运行到下一个断点
finish      ~~~~     //将一个函数(不包括main函数)运行完毕就停下来
until + 行号      ~~~~     //在一个范围内,运行到指定行,比如在Sum函数中,在这个函数范围内,我们利用until+行号跳过循环!

在这里插入图片描述

bt      ~~~~     //用来查看当前是在哪一个栈帧上,也就是目前代码走到了那个函数里
set var 变量名 = 指定值      ~~~~     //通常用在程序中有分支语句,不用修改代码,就可以观察到,如果当前变量为另一种指定值的情况,程序运行的结果是怎么样的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 解决高德地图Uncaught Error: Invalid Object: Pixel(NaN, NaN)

有点啰嗦,可以直接跳到最后看解决方法。 问题排查过程 原因起始于一个新需求:在编辑列表信息时需要修改设备位置。 按照文档一番操作,发现完美需求解决了。后续测试的时候就发现浏览器报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)…

在 Notebook 中启动 FastAPI

如何在 Notebook 使用 FastAPI 对外提供 RestAPI,当我们测试完模型时,有事需要对外提供 API 进行测试。FastAPI 是 Python 中快速提供 Rest API 的框架,本文将对外实现一个 OCR 的图片转文字的服务。 OCR 服务 本文使用 GOT OCR 提供 OCR 识…

[Git] Git下载及使用 从入门到精通 详解(附下载链接)

前言 目录 Git概述 简介 下载 Git代码托管服务 Git常用命令 Git全局配置 获取Git仓库 在本地初始化一个Git仓库 从远程仓库克隆 基本概念 工作区文件状态 本地仓库操作 远程仓库操作 分支操作 标签操作 在IDEA中使用Git 在IDEA中配置Git 本地仓库操作 远程仓…

【unity框架开发7】对象池的使用,如何封装一个对象池管理器

文章目录 什么是对象池?对象池有什么用?对象池的原理对象池的实现1、从对象池获取对象2、回收对象3、回收所有对象4、预先往这个对象池中加载指定数量的游戏对象5、最终代码 封装对象池管理器1、对象池管理器代码2、测试调用3、生成和回收游戏对象时自动…

LLM基础常见面试题

#############【持续更新】############## LLM基础常见面试题 简单介绍一下大语言模型【LLMs】? 大模型:一般指1亿以上参数的模型,但是这个标准一直在升级,目前万亿参数以上的模型也有了。大语言模型(Large Languag…

在 Windows 11 安卓子系统中安装 APK 的操作指南

这个软件好像不可以在纯android系统中使用(不知道是缺了什么),其他对于android的虚拟机要不缺少必要功能组件,要不性能过于低下。本方法致力于在带有谷歌框架WSA中运行该APK 在 Windows 11 安卓子系统中安装 APK 的操作指南 本指…

渗透测试系列之靶机渗透

Helpline是一个困难的靶机,知识点涉及EFS解密和ME SDP的多个漏洞,包括XXE漏洞、LFI\任意文件下载漏洞、身份认证绕过漏洞以及远程代码执行漏洞等. 通关思维导图 0x01 侦查 端口探测 首先使用nmap进行端口扫描 nmap -Pn -p- -sV -sC -A 10.10.10.13…

Obsidian复制代码块代码正确方式

最近在用obsidain做笔记,整体使用下来感觉不错,尤其是强大的检索功能,但是刚才使用其内置的复制代码块功能时,却被恶心到了。 现有背景是:我有一个pydantic的 code block,编辑器处于编辑模式如下&#xff…

Visual Studio的实用调试技巧总结

对于很多学习编程的老铁们来说,是不是也像下面这张图一样写代码呢? 那当我们这样编写代码的时候遇到了问题?大家又是怎么排查问题的呢?是不是也像下面这张图一样,毫无目的的一遍遍尝试呢? 这篇文章我就以 V…

【C语言】深入理解指针(二)(上)

本篇博客将讲解的知识: (1)指针的使用和传址调用 (2)数组名的理解 1、指针的使用和传址调用 (1)strlen 的模拟实现 库函数strlen的功能是求字符串的长度,统计的是字符串中‘\0’之…

onnx代码解读

一、定义 torch.jit.trace 相关代码解读onnx 内部实现 3 查看是否为aten 算子aten 算子实现torch.autograd.Functions 算子实现自定义算子实现查找未实现的节点一次性发现所有的未实现 aten 算子 二、实现 torch.jit.trace 相关代码解读 1. torch.jit.script() : 将其转换为…

数据库的基本概念、安装MySQL及基础运用

目录 一、数据库的基本概念 1. 使用数据库的必要性 2. 数据(Data) 3. 表 4. 数据库 5. 数据库管理系统(DBMS) 6. 数据库管理系统DBMS的优点 7. 使用数据库的必要性总结 8. 访问数据库的流程 二、数据库发展及基本功能 1.…

宠物空气净化器怎么选?希喂、霍尼韦尔、美的宠物哪款除毛好?

身为养宠五年的资深铲屎官,最近收到了很多新手养宠朋友关于宠物空气净化器的挑选疑问。宠物空气净化器作为宠物领域目前最火热的产品,谈论度一直很高,评价也褒贬不一。双十一购物节又即将到来,大家都想赶上这一波优惠活动。 铺天盖…

Automa插件之js脚本小技巧:零依赖的日期时间格式化,亲测好用!

背景 在使用 Automa 插件自动下载文件时,有时候需要根据当前时间重新命名文件,如果是时间戳的话倒是也可以防重复文件命名,只不过那样的话,没有了时间可读性. 所以需要日期时间格式化,分享一个一直在用的纯 js 格式化日期脚本,可实现简单的日期格式化. 文末附完整代码,直接复制…

时序约束进阶四:set_input_delay和set_output_delay详解

目录 一、前言 二、set_input_delay/set_output_delay 2.1 延时约束 2.2 约束设置界面 2.3 示例工程 2.4 Delay Value 2.5 Delay value is relative to clock edge 2.6 Delay value already includes latencies of the specified clock edge 2.7 Rise/Fall 2.8 Max/M…

教育部白名单赛事到底是什么?大家为什么那么重视它?

近年来,随着素质教育的推广和升学竞争的加剧,白名单赛事这一概念变得越来越热门。所谓的白名单赛事,是指经过教育部批准并公布的竞赛名单。这些比赛不仅具备权威性和高含金量,还受到各大中小学、重点高中和高校的广泛认可。在升学…

文件句柄泄漏排查及方法总结

如果只是怀疑文件句柄泄漏,可以通过Process Explorer 找到对应进程,双击点开查看performance中的handles变化即可,然后结合I/O项变化进行大致分析。 ——当然对于程序员而言,不光是要发现问题,还要定位问题。 针对li…

Qt 自绘开关按钮以及设计器中的提升为用法

文章目录 自绘按钮实现概要效果图代码 提升为用法介绍步骤 总结 自绘按钮实现 概要 当我们需要一个开关样式的QPushbutton,没有图片的话,我们可以采用自绘的形式实现。且使用QtDesinger中提升为Promote to的功能加入界面中,而不是使用代码的…

C++入门基础知识107—【关于C++continue 语句】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C continue 语句的相关内容!…

初始爬虫13(js逆向)

为了解决网页端的动态加载,加密设置等,所以需要js逆向操作。 JavaScript逆向可以分为三大部分:寻找入口,调试分析和模拟执行。 1.chrome在爬虫中的作用 1.1preserve log的使用 默认情况下,页面发生跳转之后&#xf…