目录
1.gdb-调试器
1.1 背景知识
对于程序的发布有两种,分别是debug模式和release模式,而 gcc 和 g++ 默认形成的可执行程序是release的,因此是无法进行调试的,所以我们在编写的时候要设置为debug的版本:
gcc 文件名称.c -o 文件名称 -debug -g
在编写命令的时候把-debug -g给带上,此时该程序是以debug方式发布的。
1.2 使用
开始:
[readelf -S 可执行程序名 -debug | grep -i debug]:读取关于debug段,从中去查看文件的调试信息。
[gdb 可执行程序名]:开始调试 [退出]:ctrl + d 或 quit调试命令
指令:
- list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
- list/l 函数名:列出某个函数的源代码。
- r或run:运行程序。
- n 或 next:单条执行。
- s或step:进入函数调用。
- break(b) 行号:在某一行设置断点。
- break 函数名:在某个函数开头设置断点。
- info break :查看断点信息。
- finish:执行到当前函数返回,然后挺下来等待命令。
- print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。
- p 变量:打印变量值。
- set var:修改变量的值。
- continue(或c):从当前位置开始连续而非单步执行程序。
- run(或r):从开始连续而非单步执行程序。
- delete breakpoints:删除所有断点。
- delete breakpoints n:删除序号为n的断点。
- disable breakpoints:禁用断点。
- enable breakpoints:启用断点。
- info(或i) breakpoints:参看当前设置了哪些断点。
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值。
- undisplay:取消对先前设置的那些变量的跟踪。
- until X行号:跳至X行。
- breaktrace(或bt):查看各级函数调用及参数。
- info(i) locals:查看当前栈帧局部变量的值。
- quit:退出gdb。
2.make/makefile-自动化构建工具
2.1 什么是make/makefile
make是一个命令,makefile是一个文件(文档),两个一搭配,就可以实现自动化的构建项目。
举一个场景:
假如我实现了一个项目,这个项目中有几百个文件,此时用gcc去编译那难道还去一行一行的去写gcc的命令吗?在这样的一个场景下就可以体现出make和makefile存在的价值是自动化的去构建项目。
此时对make/makefile的理解可以进一步补充:makefile是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它纪录了原始代码如何编译的详细信息。当makefile一旦写好,只需要一个make命令,此时整个工程完全自动编译,极大的提高了软件开发的效率。
2.2 makefile
编写Makefile其实就是完成:a.依赖关系 b.依赖方法。
举例1:
假如要对这个mytest的可执行文件进行清理可以这样
以这个例子为例,从依赖关系的角度入手,这个mytest的文件它依赖test.c,而gcc test.c -o mytest就是与之对应的依赖方法;而.PHONY修饰后面的clean,表示把clean这种目标文件设置为伪目标,伪目标的特性是,总是被执行的(总是会根据依赖关系,执行依赖方法),被修饰为伪目标的目标文件,它后面依赖关系列表可以是为空的(根据依赖方法去设置依赖关系)。
举例2:
补充:
现在有一个疑问,makefile是如何得知,我的可执行程序是最新的?
回答:是根据文件的最近修改时间来的。