- 要使用gdb调试,首先需要生成带有调试信息的可执行程序,即带有-g的gcc/g++指令
- 给程序打断点
1. 普通断点
gdb下使用
break(b) <lineNum> --> b 22 <程序执行到22行时停下>
2. 条件断点
gdb下使用
break(b) <lineNum> <断点有效条件> --> b 22 if i == 15 <在22行设置断点,当i为15时停下>
3. 开始调试
start --> 指执行一步就停住
next(n) --> 单步调试
continue(c) --> 直接到下一个断点处
step(s) --> 进入函数体中
print(p) --> 查看指定变量的值
ptype --> 查看变量类型
display --> 追踪变量的值(对for循环等查看循环过程中的变量值) --> undisplay 停止追踪某变量的值
finish --> 跳出当前函数(需要去除函数内部设置的断点)
delete(d) --> 删除对应编号Num的断点
set --> 设置某变量的值 --> set var i = 10
run(r) --> 运行程序
- makefile的编写
1. 命名规则
(1) 建议Makefile/makefile
2. 规则格式
(1) <目标>:<依赖的所有源文件>
<Tab缩进><执行命令>
例如:<makefile>
app:main.c add.c sub.c
gcc main.c add.c sub.c -o app
(2) 为了避免一次性编译过于庞大,将目标依赖拆分为多个规则
当目标依赖文件的时间比生成目标的时间早的话,则对应依赖命令更新依赖,否则不执行对应命令
app:main.o add.o sub.o
gcc main.o add.o sub.o -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
(3) 使用
makefile文件目录下执行
make --> 生成最终目标文件
(4) 使用变量来简化规则中的命令
$< --> 规则中的第一个依赖
$@ --> 规则中的目标
$^ --> 规则中的所有依赖
% --> 模式匹配
obj=man.o add.o sub.o
target=app
$(target):$(obj)
gcc $(obj) -o $(target)
%.o:%.c
gcc -c $< -o $@
- makefile中常用的函数,利用函数返回值简化makefile编写
1. 获取目录下源文件
wildcard <dirPath/fileType> --> src = $(wildcard ../src/*.c)
2. 匹配替换函数
patsubst <destFileType> <srcFileType> --> obj = $(patsubst ../src/*.c, ../src/*.o, $(src))
- 辅助规则
1. 清除原有的obj和target
clean:
rm $(obj) $(target) -f <-f表示强制执行,否则如果不存在obj会报错>
2. 执行指定规则
make <规则名> --> make clean
3. 伪目标
如果本身目录下有一个以规则名命名的文件时,执行make clean不再会执行
为了避免该错误,将规则申明为伪目标
.PHONY:clean
clean:
rm $(obj) $(target) -f
4. 忽略执行
在规则的命令前面添加(-)号,表示如果该条命令执行失败,忽略他继续向下执行
例如:
hello:
-mkdir /aa
echo "hello Linux"
第一行在根目录下创建目录肯定会执行失败,如果不加(-)则不会执行下一句命令。