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时,第二次就不会执行了,但是清理可以一直进行执行的,执行后文件就被清除了
好了,今天的分享到这里就结束了,感谢大家的支持!