gdb和makefile的讲解

简介: gdb和makefile的讲解

Linux调试器-gdb使用

gdb可以用于Linux环境下的程序的调试,就例如vs环境下的打断点,然后逐步分析语句等

1 gdb的背景

程序的发布方式有两种,debug模式和release模式

我们在使用vs21时大家都清楚,release版本是不能被调试的,而debug版本就是用于调试的程序版本

那么我们在Linux系统中默认生成的可执行程序是什么模式呢?

答案是release模式!

Linux gcc/g++出来的二进制程序,默认是release模式

所以我们在使用gdb对程序进行调试就需要将release版本转化为debug模式,我们就可以在程序后加上-g的选项

有些系统需要自己安装gdb:

yum install -y gdb

例如:

我想要gdb调试我的test2这个文件,但是调试不了,文件不符合它的格式要求

那么我们就可以用-g选项:

gcc test -o test-debug -g  将test编译后的debug版本命名为test-debug

然后你就可以看到一个debug的文件,你就用gdb 对他进行调试即可:

下图对第五行进行打一个断点

2 gdb的使用

2.1 list 打印行号
list  将所有内容和行号一起打印

2.2 run运行程序
r(run)     运行程序  遇到断点停止

2.3 执行语句
n 或 next:单条执行  对应vs里的f10
s或step:进入函数调用   对应vs里的f11

例如:

n执行

s执行:

可以看到进入了函数print

2.4 设置断点和取消断点
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点

例如:

2.5 跟踪变量
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
2.6 跳行
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数

Linux项目自动化构建工具-make/Makefile

1 make/makefile的背景

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

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

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

例如:

test3:test3.c
        gcc test3.c -o test3
.PHONY:clean
clean:
        rm -f test3.c test3

2 依赖关系和依赖方法

拿一段代码来演示:

test3:test3.c
        gcc test3.c -o test3
.PHONY:clean
clean:
        rm -f test3.c test3
2.1 依赖关系

test3和test3.c就是依赖的关系

test3:test3.c
2.2 依赖方法

这是他们之间依赖的方法

gcc test3.c -o test3

输入make指令后,就可以直接运行,test3.c的代码自动进行编译,然后存入test3

3 原理

那么make是如何工作的呢?在默认的方式下,也就是我们只输入make命令:

1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test3”这个文件,
并把这个文件作为最终的目标文件。
3. 如果hello文件不存在,或是test3所依赖的后面的test3.c文件的文件修改时间要比test3这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
4. 如果test3所依赖的文件不存在,那么make会在当前文件中找目标为test3.c文件的依赖性,如果找到则再根据那一个规则生成test3.c文件。(这有点像一个堆栈的过程)
5. 当然,你的C文件和H文件是存在的啦,于是make会生成 test3.c 文件,然后再用 test3.c 文件声明make的终极任务,也就是执行文件test了。
6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
4 清理

工程是需要被清理的,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的

可以看到:

我们用make时,第二次就不会执行了,但是清理可以一直进行执行的,执行后文件就被清除了

好了,今天的分享到这里就结束了,感谢大家的支持!

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
NoSQL 编译器 Linux
Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefile&&make详解
Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefile&&make详解
|
9月前
|
NoSQL IDE Unix
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(2)
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(2)
143 0
|
7月前
|
NoSQL Linux 开发工具
Linux基础操作6(yum,vim,gcc,gdb,makefile)
Linux基础操作6(yum,vim,gcc,gdb,makefile)
72 0
|
8月前
|
NoSQL IDE 小程序
Linux第七章之gdb与makefile使用
3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了。2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
64 0
|
9月前
|
NoSQL Ubuntu IDE
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(1)
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(1)
174 0
|
小程序 NoSQL Linux
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍(三)
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍
210 0
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍(三)
|
NoSQL Unix Linux
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍(二)
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍
208 0
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍(二)
|
自然语言处理 NoSQL 前端开发
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍(一)
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍
40363 0
【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍(一)
|
NoSQL 小程序 Linux
【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)(下)
【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)(下)
136 0
【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)(下)
|
NoSQL IDE Linux
【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)(上)
【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)(上)
182 0
【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)(上)