前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gdb和makefile的讲解

gdb和makefile的讲解

作者头像
ahao
发布2024-03-24 11:08:15
680
发布2024-03-24 11:08:15
举报
文章被收录于专栏:学习学习

Linux调试器-gdb使用

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

1 gdb的背景

程序的发布方式有两种,debug模式和release模式 我们在使用vs21时大家都清楚,release版本是不能被调试的,而debug版本就是用于调试的程序版本

那么我们在Linux系统中默认生成的可执行程序是什么模式呢? 答案是release模式! Linux gcc/g++出来的二进制程序,默认是release模式

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

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

代码语言:javascript
复制
yum install -y gdb

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

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

代码语言:javascript
复制
gcc test -o test-debug -g  将test编译后的debug版本命名为test-debug

然后你就可以看到一个debug的文件,你就用gdb 对他进行调试即可: 下图对第五行进行打一个断点

2 gdb的使用
2.1 list 打印行号
代码语言:javascript
复制
list  将所有内容和行号一起打印
2.2 run运行程序
代码语言:javascript
复制
r(run)     运行程序  遇到断点停止
2.3 执行语句
代码语言:javascript
复制
n 或 next:单条执行  对应vs里的f10
s或step:进入函数调用   对应vs里的f11

例如: n执行

s执行: 可以看到进入了函数print

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

例如:

2.5 跟踪变量
代码语言:javascript
复制
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
2.6 跳行
代码语言:javascript
复制
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是一个文件,两个搭配使用,完成项目自动化构建

例如:

代码语言:javascript
复制
test3:test3.c
        gcc test3.c -o test3
.PHONY:clean
clean:
        rm -f test3.c test3
2 依赖关系和依赖方法

拿一段代码来演示:

代码语言:javascript
复制
test3:test3.c
        gcc test3.c -o test3
.PHONY:clean
clean:
        rm -f test3.c test3
2.1 依赖关系

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

代码语言:javascript
复制
test3:test3.c
2.2 依赖方法

这是他们之间依赖的方法

代码语言:javascript
复制
gcc test3.c -o test3

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

3 原理

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

代码语言:javascript
复制
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时,第二次就不会执行了,但是清理可以一直进行执行的,执行后文件就被清除了

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Linux调试器-gdb使用
    • 1 gdb的背景
      • 2 gdb的使用
        • 1 make/makefile的背景
        • 2 依赖关系和依赖方法
        • 3 原理
        • 4 清理
    • Linux项目自动化构建工具-make/Makefile
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档