目录
1. gdb
gbd:是一种调试器--用于调试一个程序的运行过程,查找程序出问题的位置。
程序调试的前提:是该程序必须是一个debug版本的程序。
对于程序的版本分为两种:
- debug版本程序:调试版本,不会对代码进行任何优化,并且会加入调试符号信息;
release版本程序:发布版本,会对代码进行一些优化,更利于程序的运行效率(无法调试)
值得注意的是,gcc一般默认生成的是release版本程序,如果想要生成debug版本程序则需要再编译程序的时候,加上-g选项。即:gcc -g main.c -o main。
调试过程:
1.使用gdb加载程序:gdb ./main;
2.开始调试:
- start--开始逐步调试;
- run--直接运行;
3.逐步调试:
- next--下一步(逐过程);
- step--下一步(逐语句);
- until:main.c:18--直接运行到指定文件的指定行(18);
4.查看代码:
- list--默认查看调试行附近的代码,list main.c:18查看指定文件指定行附近的代码;
5.断点操作:
- break main.c:18 给指定代码指定行打断点,或可以break Fun直接给对应函数打断点;
- continue:从当前调试位置开始继续向下运行(并不是逐步调试,而是直接运行);
- info break:查看所有断点信息;
- delete break_id:删除指定断点;
6.内存操作:
- 变量数据的查看与设置:print val -- 查看指定变量的数据,print val = 10 -- 设置变量的数据;
- 查看函数调用栈:backtrace,程序当前运行位置肯定是调用栈的栈顶函数,因为函数是逐个压栈的。
2.make&makefile
make&makefile:是项目的自动化构建工具。
makefile:普通的文本文件,在该文件中可以记录项目的规则;(#是注释)
make:是一个程序,叫做makefile解释器,即是makefile中的编写规则,
对于makefile存在一定的编写规则:
1.必须有目标对象,就是我们要生成的文件名称,或者说是需要完成的操作名称;
2.可以有依赖对象,要生成目标对象文件,需要依赖哪些文件,目标对象和依赖对象之间以冒号间隔;
3.目标生成规则中的指令 -- 要生成一个文件或者完成一个操作所需要执行的指令(注意指令前必须有个TAB制表符)
对于make的解释执行规则:
1.执行make的时候,会在当前目录下找寻makefile文件进行解释;
2.找到makefile后,在makefile中,找到第一个目标对象,作为要生成的终极*/目标对象(即makefile中的第一个目标对象);
3.检测目标对象是否需要重新生成;(检测目标和依赖的时间关系,在上一次目标对象被生成后,依赖对象是否被修改)
- 当目标对象不存在,肯定需要重新生成;
- 依赖对象被修改过,肯定需要重新生成;
- 依赖对象不存在,则需要查找依赖对象的生成规则,先对依赖对象进行生成。
4.所有的依赖对象都更新生成之后,然后再执行指令,生成终极目标对象。
makefile中其他的编写规则:
1.伪对象:与外部的实际文件解除关联关系,表示该对象一定会进行规则指令的执行;
声明:.PHONY:main,即是将main声明为伪对象。
2.自动变量(预定义变量):在不同位置表示不同数据的内置变量。
还存在一些函数来获取具有共同特征的文件,例如:
- $(wildcard ./*.c) 获取指定规则的文件名,此处是获取.c文件;
- $(patsubst %.c, %.o, $(var)) 字符串替换,此处是将var变量中的内容.c替换成.o。
3.git
git:项目的版本管理工具,对代码进行托管,并进行版本管理。
优点:
- 托管备份,容灾性强
- 版本管理,随时可以进行版本回滚
git本质上是一种分布式的思想,即每一个主机都是一个git仓库,并且可以任意选择其中某一个仓库当作主仓库。
git操作的三板斧操作:
1.git clone:从托管服务器克隆一个分支仓库到本地;
2.git add:添加本地仓库所修改的文件记录;
3.git commit:提交本地仓库的版本;
4.git push:将本地仓库版本同步到托管平台。