四、Linux调试器-gdb
1、背景及概念
相关概念:
程序的发布方式有debug模式和release模式
Linux gcc/g++编译链接出来的可执行程序默认是release模式
gdb 是 Linux 里的调试器,想调试必须在源代码生成可执行程序的时候加上 -g 选项
为什么要有debug和release:
在程序开发时程序员遇到bug需要调试,而调试需要在程序里内置调试信息
而对于发布面向的是用户,用户不需要调试信息
示图:
2、调试命令
示例:
#include<stdio.h> int Sum(int num) { int i=1,sum=0; for(;i<=num;i++) { sum+=i; } return sum; } int main() { int num=100; int sum=Sum(num); printf("%d\n",sum); return 0; }
使用
gdb +文件名:进入调试 ctrl + d 或 quit/q :退出调试
- 展示:
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行 list/l 函数名:列出某个函数的源代码 info break/ info b :查看断点信息 print/p:打印表达式的值,通过表达式可以修改变量的值或者调用函数 display 变量名:跟踪查看一个变量,每次停下来都显示它的值 undisplay:取消对先前设置的那些变量的跟踪 info(i) locals:查看当前栈帧局部变量的值 breaktrace(或bt):查看各级函数调用及参数
- 修改:
set var:修改变量的值
- 断点:
break/b 行号:在某一行设置断点 break 函数名:在某个函数开头设置断点 delete breakpoints/d:删除所有断点 delete breakpoints n/d n:删除序号为n的断点 disable breakpoints/disable:禁用断点 enable breakpoints/enable:启用断点
注:禁用断点的作用是在使用断点后调试无误用来记录已经调试过
- 执行:
run/r:从开始连续而非单步执行程序(从新运行,有断点运行到第一个断点,否则运行完毕) next/n:单条执行 continue/c:从当前位置开始连续而非单步执行程序(执行到下一个断点处) step/s:进入函数调用 finish:执行到当前函数返回,然后挺下来等待命令 until X行号:执行跳至X行
五、Linux项目自动化构建工具-make/Makefile
1、背景及概念
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令
makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
2、使用及原理
确定目标文件和源文件的依赖关系,有了依赖关系还需要依赖方法(用来确定具体如何执行生成目标文件)
示例:
注意:
依赖方法快捷写法示例:gcc -o $^ $@
@ : 对 应 的 是 目 标 文 件 ; @:对应的是目标文件;@:对应的是目标文件;^:表示依赖文件列表
执行过程/原理:
在默认的方式下只输入make命令,则会在当前目录下找名字叫“Makefile”或“makefile”的文件
如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,它会找到“test”这个文件,并把这个文件作为最终的目标文件
如果test文件不存在,或是test所依赖的后面的依赖文件的文件修改时间要比这个文件新,那么它就会执行后面所定义的命令来生成test这个文件
如果test所依赖的文件不存在,那么make会在当前文件中找目标为以依赖文件的依赖性,如果找到则再根据那一个规则生成依赖文件
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件
在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理
make只管文件的依赖性,即如果在找了依赖关系之后,之后如果还写有目标文件都不会进行生成
项目清理:
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,需要显示make执行,即命令“make clean”以此来清除所有的目标文件,以便重编译
对于clean这种目标文件,我们将它设置为伪目标(用 .PHONY 修饰),伪目标的特性是总是可以被执行(可以多次执行)
示图: