makefileGDB使用

news2024/11/16 12:35:18

一、makefile

1、make && makefile

makefile带来的好处就是——自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率

下面我们通过如下示例来进一步体会它们的作用:

①编写makefile文件

touch makefile
vim makefile

使用vim编辑器编辑makefile文件:

image-20230407150615108

#makefile文件中的内容
hello.exe:hello.c  
	gcc hello.c -o hello.exe
.PHONY:clean
clean:
	rm -f hello.exe

此时我们只需一个make命令即可完成自动编译:

make

image-20230407151005413

make命令的作用,即是执行makefile中的命令,此处执行的命令是:

gcc hello.c -o hello.exe

当我们输入:

make clean

image-20230407145636879

此处就执行了:

rm -f hello.exe

2、make执行步骤

当我们在Linux中输入并执行make命令时,make会干些什么呢?

step 1:make会在当前目录下寻找Makefile文件,找到了就会用这个文件作为后续操作的依据;如果没找到Makefile,就会寻找名为makefile的文件;两个都没找到就报错;

step 2:找到Makefile或者makefile之后,默认文件中第一行作为第一个目标;make命令会分析第一个目标的依赖关系,并且执行该目标的依赖方法**;

2.1 依赖关系

hello.exe:hello.c                #依赖关系

makefile文件中hello.exe就是目标(期望生成的内容);我们编译文件hello.c期望生成它对应的可执行文件hello.exe,而你要编译生成这个目标文件,需要依赖hello.c这个文件,这就是依赖关系

2.2 依赖方法

有了依赖关系,我们就知道了生成目标可执行文件hello.exe需要依赖hello.c这个文件,那么我们该怎么利用hello.c文件生成hello.exe文件呢?我们是不是还缺少一个方法,而这个使用目标的依赖关系文件生成期望的目标文件的方法就是依赖方法

gcc hello.c -o hello.exe         #依赖方法

image-20230407151439095

需要注意的是,依赖文件列表可以为空

3、项目清理

# makefile文件中的清理部分
.PHONY:clean
clean:
	rm -f code

image-20230407151637813

上述makefile文件中,该部分即为项目清理部分;在上述介绍中,我们知道需要显式输入make clean才能实现清除编译好的文件hello.exe以便重新编译:

image-20230407151932323

其中.PHONY的使用,是将它设置为伪目标,伪目标的特性是:总是被执行的

4、伪目标 .PHONY

👉 怎样理解总是被执行的?我们试着多次输入make指令,发现结果如下:

image-20230407152245884

结果:当第一次使用make命令时,目标被执行生成了一个可执行文件,而当我们再使用make命令时发现make虽然不会报错但是会告诉我们生成的文件的已经是最新的了,目标并没有被执行


那么多次输入make clean指令呢?结果如下:

image-20230407152336502

可以一直执行rm -f hello.exe这条指令!(即使已经重复执行了)


我们将生成可执行文件过程更改为伪目标(使用vim编辑器):

# 修改makefile文件
.PHONY:hello.exe
hello.exe:hello.c
	gcc hello.c -o hello.exe

image-20230407152918399

再测试一下:

image-20230407153021133

二、GDB

GDB是命令行模式的调试工具,能够让用户在程序运行时观察程序的内部结构和内存的使用情况。

1、准备工作

gdb_test.c:

#include<time.h>

void Print(int sum)
{
    long long timestamp=time(NULL);
    printf("result=%d,timestamp:%lld\n",sum,timestamp);
}

int AddtoVal(int from,int to)
{
    int sum=0;
    for (int i = from; i <= to; i++)
    {
        sum+=i;
    }
    return sum;
}

int main()
{
    int sum=AddtoVal(0,100);
    Print(sum);
    return 0;
}

生成可执行文件:

1、debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
 2、release版本:不会添加任何调试信息,是不可调试的。

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项

gdb_test_g.exe:gdb_test.c
	gcc gdb_test.c -o gdb_test_g.exe -g
.PHONY:clean
clean:
	rm -rf gdb_test_g.exe

可使用工具读取可执行程序符号表debug部分:

[Kevin@VM-8-13-centos code1]$ readelf -S gdb_test_g.exe | grep debug
  [26] .debug_aranges    PROGBITS         0000000000000000  00001095
  [27] .debug_info       PROGBITS         0000000000000000  000010c5
  [28] .debug_abbrev     PROGBITS         0000000000000000  00001536
  [29] .debug_line       PROGBITS         0000000000000000  000016af
  [30] .debug_str        PROGBITS         0000000000000000  000017d5

总结:要用gdb调试,首先要进行给编译器添加-g

2、正式调试

调试命令:

进入gdb:gdb 文件名

显示代码:l n 显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示。

打一个断点:b n在第n行设置断点。

查看已打断点:info b

去掉打的断点:d 断点编号 删除指定编号(不是行号)的断点。

开始调试运行:r(run)

逐过程:n(next)

逐语句:s(step)会进入函数体中

运行到下一个断点处:c(continue)

查看函数调用堆栈:bt

直接运行完当前函数:finish 个性化跑完自定义的一个个函数,方便定位代码错误的位置

打印变量的值/地址:p(print)变量/&变量

将变量的值/地址加入常显示:display 变量/&变量

取消指定编号变量的常显示:undisplay 编号

跳出循环/跳转至指定行:until 行号

修改变量值:set var 变量=x 将变量的值修改为x

退出gdb:quit/ql
continue)

查看函数调用堆栈:bt

直接运行完当前函数:finish 个性化跑完自定义的一个个函数,方便定位代码错误的位置

打印变量的值/地址:p(print)变量/&变量

将变量的值/地址加入常显示:display 变量/&变量

取消指定编号变量的常显示:undisplay 编号

跳出循环/跳转至指定行:until 行号

修改变量值:set var 变量=x 将变量的值修改为x

退出gdb:quit/ql

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

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

相关文章

今日arXiv最热大模型论文:点击即可播放!港中文发布大模型写歌神器!

一首歌&#xff0c;包含作词作曲两个部分。擅长作词or作曲就已经很牛了。比如方文山是周杰伦的御用作词人&#xff0c;而周杰伦写过很多耳熟能详的曲子。而兼具作词作曲才华的全能创作人却是难得一见。 最近港中文发布了一款歌曲创作大模型SongComposer&#xff0c;作词作曲都…

Pegasus智能家居套件样例开发--软定时器

样例简介 此样例将演示如何在Pegasus Wi-Fi IoT智能家居套件上使用cmsis 2.0 接口进行定时器开发。 工程版本 系统版本/API版本&#xff1a;OpenHarmony 3.0 releaseIDE版本&#xff1a;DevEco Device Tool Release 3.0.0.401 快速上手 准备硬件环境 预装windows系统的PC…

uniapp项目申请短信模板临时Nginx配置

现在申请短信模板不允许有变量&#xff0c;且要指向实际业务网站&#xff0c;因为项目是小程序&#xff0c;用uniapp写的&#xff0c;现在申请短信&#xff0c;把uniapp打包成h5项目&#xff0c;上传至服务器&#xff0c;修改niginx配置中springboot项目部分&#xff0c;记录一…

Netty之ChannelHandlerMask详解

Netty的ChannelHandlerMask是用于标记ChannelHandler的位掩码。它被用于指示ChannelHandler的事件处理方式。ChannelHandlerMask 定义了ChannelHandler所有事件。 final class ChannelHandlerMask {static final int MASK_EXCEPTION_CAUGHT 1;static final int MASK_CHANNEL_…

前端src中图片img标签资源的几种写法?

在 Vue 项目中引用图片路径有几种不同的方法&#xff0c;具体取决于你的项目结构和配置。以下是几种常见的方式&#xff1a; 1. 静态资源目录 (Public) 如果你的图片放在了项目的 public 目录下&#xff08;例如&#xff0c;Vite 和 Create Vue App 脚手架工具通常使用这个目…

关于页面置换算法的例题(2)

考虑一个500字的程序的下述逻辑地址访问序列&#xff1a;10&#xff0c;11&#xff0c;104&#xff0c;170&#xff0c;73&#xff0c;309&#xff0c;185&#xff0c;245&#xff0c;246&#xff0c;434&#xff0c;458&#xff0c;364。假定采用页式虚拟内存管理&#xff0c;…

力扣hot100题解(python版41-43题)

41、二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

理解C#里面的集合有哪些?怎么用,什么是安全集合?

介绍 在C#中&#xff0c;集合是一种用于存储和操作多个元素的数据结构。它们提供了各种操作&#xff0c;如添加、删除、查找等&#xff0c;以及遍历集合中的元素。集合通常根据其实现方式和行为特征进行分类。 集合继承IEnumerable 在C#中&#xff0c;几乎所有的集合类型都实现…

uniapp同步将本地图片转换为base64,支持微信、H5、APP

接上篇&#xff0c;少了一个方法的源代码。 先上代码&#xff1a; ploadFilePromiseSync (url) > { return new Promise((resolve, reject) > { // #ifdef MP-WEIXIN uni.getFileSystemManager().readFile({ filePath: url, encoding: base64, success: res > { let …

TVM 和模型优化的概述(1)

文章目录 1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型&#xff08;model&#xff09;。2.翻译成 Relay3. lower 到 张量表达式。4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。5. 选择最佳配置进行模型编译。6. lower 到 TIR。7. 编译成机器码…

【JavaScript】面试手撕节流

引入 上篇我们讲了防抖&#xff0c;这篇我们就谈谈防抖的好兄弟 – 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。 PS: 开源节流中节流与这个技术上的节流&#xff0c;个人认为本质上是一样的。 开源节流的节流指的是节省公司的金钱开支。前端技术上的…

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

Python实现双向链表:从基础到应用

一、引言 双向链表是一种比单向链表更复杂的数据结构&#xff0c;每个节点除了包含数据和指向下一个节点的指针外&#xff0c;还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始&#xff0c;向前或向后遍历链表。 目录 一、引言 二、节点定义 三、…

谷歌最强开源大模型亮相!Gemini技术下放,笔记本就能跑,可商用

明敏 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌大模型&#xff0c;开源了&#xff01; 一夜之间&#xff0c;Gemma系列正式上线&#xff0c;全面对外开放。 它采用Gemini同款技术架构&#xff0c;主打开源和轻量级&#xff0c;免费可用、模型权重开源、允许商用&#xff0c;…

C++ STL:set/multiset、map/multimap源码剖析

C STL中set和map底层数据结构为红黑树rb_tree。具体可以参考这篇文章。 ​​​​​​C STL &#xff1a;红黑树rb_tree源码剖析-CSDN博客 set插入时插的就是key&#xff0c; map插入时插的是value(键值对)&#xff0c; 排序时底层的红黑树会根据key_compare(也就是模版…

[回归指标]R2、PCC(Pearson’s r )

R2相关系数 R2相关系数很熟悉了&#xff0c;就不具体解释了。 皮尔逊相关系数&#xff08;PCC&#xff09; 皮尔逊相关系数是研究变量之间线性相关程度的量&#xff0c;R方和PCC是不同的指标。R方衡量x和y的接近程度&#xff0c;PCC衡量的是x和y的变化趋势是否相同。R方是不…

可用于智能客服的完全开源免费商用的知识库项目

介绍 FastWiki项目是一个高性能、基于最新技术栈的知识库系统&#xff0c;专为大规模信息检索和智能搜索设计。利用微软Semantic Kernel进行深度学习和自然语言处理&#xff0c;结合.NET 8和MasaBlazor前端框架&#xff0c;后台采用.NET 8MasaFrameworkSemanticKernel&#xff…

深入理解Java泛型及其在实际编程中的应用

第1章&#xff1a;泛型的起源与重要性 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;泛型&#xff08;Generics&#xff09;是一种不可或缺的特性&#xff0c;它允许咱们在编码时使用类型&#xff08;Type&#xff09;作为参数。这听起来可能有点绕&#xff0c…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

文件基础和文件fd

文章目录 预备知识C语言的文件接口系统调用文件fd 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…