gdb调试
- -g:使用该参数编译可执行文件,得到调试表
- gdb a.out
- list:l/list 1 列出源码,根据源码指定行号设置断点
- b/breakpoint: b 20 在20行位置设置断点
- r/run:运行程序
- n/next:下一条指令(会越过函数)
- s/step:下一条指令(会进入函数)
- p/print:p i 查看变量的值。
- coutinue:继续执行断点后续指令。
- quit:退出 gdb 当前调试
其他指令:
- run:使用 run 查找段错误出现位置
- finish:结束当前函数调用
- set args:设置main函数命令行参数(在start、run之前)
- run 子串1 字串2 … :设置main函数命令行参数
- info b:查看断点信息表
- b 20 if i = 5 :设置条件断点
- ptype:查看变量类型
- bt:列出当前程序正存活着的栈帧
- frame:根据栈帧编号,切换栈帧
- display:设置跟踪变量
- undisplay:取消设置跟踪变量,使用跟踪变量的编号来进行取消
Makefile项目管理
- 用途
- 项目代码编译管理
- 节省编译项目时间
- 一次编写终身受益
- 操作示例文件:add.c sub.c mul.c dive.c main.c
- 命名:makefile Makefile
- Makefile工作原理
- 基本原则:
- 若想生成目标文件,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件。
- 检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任意一个被更新,则目标必须更新。
- 分析各个目标和依赖之间的关系
- 根据依赖关系自底向上执行命令
- 根据修改时间比目标新,确定更新
- 如果目标不依赖任何条件,则执行对应命令,以示更新。
- 基本原则:
-
一个规则:
- 目标:依赖条件
(一个tab缩进)命令- 目标的时间必须晚于依赖条件的时间,否则,更新目标
- 依赖条件如果不存在,找寻新的规则去产生或创建依赖
- ALL:目标
- 指定makefile的终极目标
- 目标:依赖条件
-
两个函数:
- src = $(wildcard ./*.c) :匹配当前工作目录下的所有 .c 文件。将文件名组成列表,赋值给变量 src。
- obj = $(patsubst %.c, %.o, $(src)):将参数3中,包含参数1的部分,替换为参数2。
- clean: (没有依赖)
-rm -rf $(obj) a.out $emsp; “-”:作用是,删除不存在文件时,不报错。顺序执行结束。
-
三个自动变量:
- $@:表示规则中的目标
- $<:表示规则中的第一个依赖条件,如果将该变量应用在模式规则中,它可将依赖条件中的依赖依次取出,套用模式规则。
- $^:表示规则中的所有依赖条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项。
-
模式规则:
- %.o:%.c
gcc -c $< -o %@
- %.o:%.c
-
静态模式规则:
- $(obj):%.o:%.c
gcc -c $< -o %@
- $(obj):%.o:%.c
-
伪目标:
- .PHONY:clean ALL
-
参数:
- -n:模拟执行 make、make clean 命令
- -f:指定文件执行 make 命令。
2019 ZhiZDK 如转载请声明。