一、调试器gdb
1、GNU计划的工具;内核调试工具KGDB。
2、程序的错误分类:
(1)编译时错误:语法错误;
(2)运行时错误:内存错误,逻辑错误。
3、gdb的功能:
(1)运行程序;
(2)设置断点;
(3)查看变量值。
4、使用实例:
源文件:hello.c
gcc编译hello.c:gcc -g hello.c -o hello
运行:gdb hello
例:
gcc -g demo.c -o demo
gdb demo
(gdb)run:执行程序
(gdb)list:查看程序源代码(显示不完整/run后不显示)
(gdb)break 11:设置断点(停在第11行)
(gdb)run:代码停在第11行
(gdb)print sum:查看变量值
(gdb)next/n:单步执行
(gdb)quit/q:退出
图形化:gdb demo –tui
(gdb) layout asm
(gdb) layout src
(gdb) layout split
5、使用:
(1)–tui图形化:
1)layout asm:(layout:布局)显示汇编
2)layout src:显示源码
3)layout split:作分割
(2)运行程序:
1)run:运行程序
2)continue:结束当前断点,继续往下执行,直至遇到下一次断点
(3)设置断点:
1)break+行号
2)break+函数名
3)break+行号 if 条件
4)info break:查看断点信息
5)delete+断点编号: 删除断点
6)enable+断点编号:启用断点
7)disable+断点编号:关闭断点
8)print sum:打印变量值
(4)单步执行:
1)step/s:可进入子函数
2)next/n:不可进入子函数
二、工程管理器:make(cmake)
1、工程管理器:编译很多个文件(类型不同、存放在不同目录、资源文件的使用)组成的软件代码结构。
2、工程管理器特点:根据makefile文件(手工创建)的内容,实现自动编译。
3、“自动编译”:
(1)make通过读取makefile文件中所写内容进行自动编译;
(2)根据文件的时间戳来判断文件是否需要编译。
4、makefile:
(1)makefile是个脚本文件(做批处理)
(2)makefile语法:目标、依赖、命令
1)格式:
目标:依赖
按下tab 命令
2)三者关系:执行命令,依赖这个文件,最终生成目标。
例:
hello:hello.c
gcc hello.c -o hello
执行gcc hello.c -o hello命令,依赖于hello.c文件,最终生成目标文件hello。
hello.o:hello.c
gcc -c hello.c
3)makefile执行顺序:自上向下,但当你的目标依赖的文件又是一个目标时,会先跳转到该目标去执行相关命令。
4)make+目标名:自该目标开始自上向下执行。
5)伪目标:只执行命令,不生成对应的文件。
例:.PHONY:clean install(定义的两个伪目标:clean、install)
6)mv makefile Makefile:将小写makefile改为大写。
7)echo:在终端上输出一个字符串
echo make done!(当makefile大小写同时存在的情况下,优先执行小写)
8)make -f Makefile:指定用大写的Makefile进行编译。
-f:依托于某个指定的makefile进行编译。
9)mv makefile Makefile1:不一定是makefile文件,但可使用-f指令。
10)在每条命令前加@:将命令回显关闭。
11)@echo make hello.c done:检查是否编译成功。(提示信息)
12)$@(内置变量):代表目标体后的依赖。
13)定义变量:
例:
obj=hello.o
hello:$(obj)
用obj替代hello.c
用$(obj)替代使用hello.c
14)#:表注释
在某一行前加#:注释该行
(3)编写makefile实例:
有add.c、sub.c、mul.c、div.c和hello.c文件
1)传统编译执行方法:
gcc *.c -o cal
./cal
2)make编译执行方法:
编写Makefile文件,最终生成可执行文件cal ,支持clean操作:
(4)将.c文件先编译生成.o文件,再由.o文件生成可执行文件的原因:节约编译时间
前提:源文件到可执行文件:预处理、编译、汇编、链接(假设每个过程1s)
则一个gcc hello.c -o hello需要4s
而cal:add.c sub.c mul.c div.c main.c
所以gcc *.c -o cal共需要20s
1)假设修改了add.c,之后make:每次所需时间均为20s
2)假设修改了add.c,之后make(.c–>.o):
第一次编译:需要20s;
第二次编译:4s+4s=8s
5、按功能目录管理软件代码:
makefile:
(1)总控Makefile:进入各个功能目录执行make命令,并将所欲.o文件链接生成可执行文件。
(2)功能目录Makefile:将功能目录下的源文件编译生成目标文件.o。
(3)scripts目录头文件Makefile:定义变量,供其他makefile使用。
阅读源码时,看Makefile的顺序:先看scripts目录下的Makefile;再看总控下的Makefile;最后看功能目录下的Makefile。