makefileGDB使用

一、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.cgcc 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.cgcc 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.mzph.cn/news/711287.shtml

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

相关文章

使用 Python 实现一个飞书/微信记账机器人,酷B了!

Python飞书文档机器人 今天的主题是&#xff1a;使用Python联动飞书文档机器人&#xff0c;实现一个专属的记账助手&#xff0c;这篇文章如果对你帮助极大&#xff0c;欢迎你分享给你的朋友、她、他&#xff0c;一起成长。 也欢迎大家留言&#xff0c;说说自己想看什么主题的…

代码随想录第天 78.子集 90.子集II

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

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…

debian/ubuntu 编译安装nginx php

debian/ubuntu 编译安装nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #关闭防火墙, 可能不需要 修改nginx运行用户为tboqi 抱着log目录可…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

【Elasticsearch管理】网络配置

文章目录 HTTP高级网络设置高级TCP设置 TransportTCP传输概要文件Transport跟踪 线程池fixed线程池fixed_auto_queue_sizescaling处理器设置 HTTP Elasticsearch只在默认情况下绑定到本地主机。对于运行本地开发服务器(如果在同一台机器上启动多个节点&#xff0c;甚至可以运行…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件

《极客时间 - 左耳听风》【文章笔记个人思考】

《极客时间 - 左耳听风》原文链接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 这里的Leader是在技术上取得优势&#xff0c;而不是行政…

2024年2月个人工作生活总结

本文为 2024年2月工作生活总结。 研发编码 一些警告修正记录 这个月修正了个人所负责的工程警告&#xff0c;这些警告其实是前人的代码遗留的&#xff0c;我续写的代码&#xff0c;除printf函数的%d、%ld格式&#xff0c;都在写的过程中改了。 下面记录一些典型的警告及应对…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

git操作学习记录,简单易上手

配置git 的账户邮箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代码回溯 git rest --hard [commit哈希值]git log命令只能查看以当前状态为终点的历史日志 git reflog命令&#x…

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系 多标签实体和实体去重 数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人员使用研究…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬虫——Urllib库-3

目录 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 获取豆瓣电影前十页的数据 ajax的post请求 总结 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 首先可以在浏览器找到发送数据的接口 那么我们的url就可以在header中找到了 再加上UA这个header 进行请…

Facebook的元宇宙实践:数字化社交的新前景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念备受瞩目&#xff0c;被认为是数字化社交的未来趋势之一。而在众多科技巨头中&#xff0c;Facebook&#xff08;现更名为Meta&#xff09;一直处于元宇宙发展的前沿。在本文中&#xff0c;我们将深入探讨Fac…

万字带你走过数据库的这激荡的三年

本文收集了卡内基梅隆大学计算机科学系数据库学副教授 Andy Pavlo 从 2021 到 2023 连续三年对数据库领域的回顾&#xff0c;希望通过连续三年的回顾让你对数据库领域的技术发展有所了解。 关于 Andy Pavlo&#xff1a;卡内基梅隆大学计算机科学系数据库学副教授&#xff0c;数…

vuepress项目侧边栏菜单配置使用

第一种菜单配置&#xff0c;自定义菜单名称 {text: 菜单名称,// 是否折叠collapsible: true,children: [{text: "自定义md菜单名称",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二种菜单配置 标题自动生成菜单&#xff0c;使用需要搭配sideb…

c语言求矩阵的局部极大值

给定M行N列的整数矩阵A&#xff0c;如果A的非边界元素A[i][j]大于相邻的上下左右4个元素&#xff0c;那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。 输入格式&#xff1a; 输入在第一行中给出矩阵A的行数M和列数N&#xff08;3≤…