今天是对前面两天的补充和完善。
1、gdb
1.1 gdb 作用
调试程序
1.2 调试bug的步骤
测试:发现问题
固化:让bug重现
定位:找到bug的位置
修改:修改bug
验证
1.3 gdb调试工具的使用
1->想要使用gdb调试工具,在编译的时候gcc后面加一个-g,生成带有调试信息的可执行程序
带有调试信息的可执行程序要比直接编译的要大一些。
2->启动gdb
格式:gdb./可执行程序
1.4 gdb的常用命令
退出:quit q
清屏:ctrl +L
显示代码:
list或者l(小写的L) 只会显示10行代码
list 行号 显示该行附近的10行代码
运行指令:run
设置断点:---断点:运行到该行,会停止运行
break 行号 简写:(b 行号)
查看断点:info break
设置断点:默认是使能状态 (使能:该断点起作用)
使能:使该断点起作用
enable +断点的编号
失能:使该断点失去作用,不起作用
disable +断点的编号
删除断点:
delete +断点的编号
clear +断点的行号
继续运行: cont c
打印变量的值:print 变量名
调试程序思想1:
设置断点 + run +print + c
调试程序思想 2 :单步调试
运行 start
n next:下一步,按步调试,遇到函数,不会进入函数内部
s step:下一步,按步调试,遇到函数,会进入函数内部
finish :结束当前函数,返回到调用点;
整体思想:用n来把控全局,遇到自己想进入的子函数的时候,再使用s进入
遇到主函数传参:gdb-args ./xxxx
2、 makefile
2.1 安装 makefile
sudo apt-get install make
2.2 makefile 的作用
工程管理工具:名字为make的文件;
将你原本给终端写的指令,写入到该文件中
make 之后自动执行makefile中的指令,make
2.3 makefile的使用
思想:目标和依赖
vim makefile 打开/创建并打开一个makefile文件
格式:1
目标:依赖
(按Tab键)命令
格式2:没有依赖的目标,称为伪目标
目标:
按Tab键) 命令
第二个 makefile
#表示注释
makefile中的变量:
变量名=原来的内容 C=gcc
变量的引用:$(变量名) $(C) 等价于gcc
特殊变量:
$@:目标
$^:所有的依赖
$<:所有依赖中的第一个依赖
%.o:%.c
gcc -c $< -o $@
静态库封装:
动态库封装:
拓展: makefile 里面的函数:
wildcard
原型:$(wildcard <pathname>)
功能:查找<pathname>下指定文件
返回:包含路径的所有指定文件
SRCPATH=$(wildcard ./src/*.c)
$(SRCPATH) 等价于 src/main.c src/add.c src/del.c
notdir
原型:$(notdir <names...>)
功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠 ( “ /”)
之后的部分。
返回:返回文件名序列<names>的非目录部分
SRCNOPATH=$(notdir $(SRCPATH))
$(SRCNOPATH) 等价于 main.c del.c add.c
patsubst
原型:$(patsubst <pattern>,<replacement>,<text>)
功能:查找<text>中的单词( 单词以“空格”、 “Tab”或“回车”“换行”分隔) 是否符合模式
<pattern>, 如果匹配的话, 则以<replacement>替换。 这里, <pattern>可以包括通配符“%”,
表示任意长度的字串, 按照名字匹配。
返回:函数返回被替换过后的字符串
LIBPATH = $(patsubst %.c ./lib/%.o $(SRCNOPATH))
$(LIBPATH) 等价于 ./lib/main.o ./lib/add.o ./lib/del.o