gdb调试工具
前提:编译时添加 -g选项,得到调试表 gcc gdbtest.c -o a.out -g
如果忘记加 -g选项编译就进入gdb调试,报错如下:

解决方法:
- 退出gdb调试工具,重新加上
-g选项再编译 - 不退出gdb调试工具,输入命令
file a.out即可
常用指令:
- 打开gdb调试工具:
gdb ./a.out - 列出源码以及行号:
list或者l(按list 1即可从代码第一行开始显示,按l翻页) - 设置断点:
b或者break,比如b 45 - 运行程序:
run或者r - 下一条指令(越过函数):
n或者next - 下一条指令(进入函数):
s或者step - 查看变量的值:
p或者print(p i代表查看变量i的值) - 结束当前函数调用:
finish - 继续执行断点后续指令:
continue(即执行到下一个断点,如果后续没有断点,则执行到程序结束) - 退出gdb当前调试:
quit
其他指令:
- 针对段错误:打开gdb后,直接使用
run命令,程序停止的位置就是段错误出现的位置 - 设置main函数命令行参数:①
set args参数1 参数2(在start、run之前)或者②run 参数1 参数2 - 查看断点信息表:
info b - 设置条件断点:
b 20 if i = 5 - 查看变量类型:
ptype - 查看当前程序正存活的栈帧:
bt - 根据栈帧编号切换栈帧:
frame 2 - 设置跟踪变量:
display - 根据跟踪变量的编号,取消设置跟踪变量:
undisplay2
注:栈帧是随着函数调用而在stack上开辟的一片内存空间,用于存放函数调用时产生的局部变量和临时值

Makefile项目管理
前提:如果想使用默认make命令,命名时只能是makefile或者Makefile
1个规则(格式)
目标:依赖条件
(一个tab缩进)命令

- 目标的时间必须晚于依赖条件的时间,否则
make时自动更新目标(也就是说,如果“原料”修改了,脚本运行是会智能执行这个“原料”的修改) - 依赖条件如果不存在,找寻新的规则去产生依赖条件(如下图所示)

ALL:hello.out(指定makefile的终极目标,如果不指定,默认第一行是终极目标)
2个函数
- wildcard函数:
src = $(wildcard ./*.c)匹配当前工作目录下的所有.c 文件,将文件名组成列表,赋值给变量 src,则src = hello.c add.c sub.c div1.c - patsubst函数:
obj = $(patsubst %.c, %.o, $(src))将参数3中,包含参数1的部分,替换为参数2,则obj = hello.o add.o sub.o div1.o,那么在makefile文件中hello.out:hello.o add.o sub.o div1.o就可以改写为hello.out:$(obj)
clean:

在命令行执行时,最好加上-n,即make clean -n,目的是先模拟删除,不真正执行,防止误删文件

“-”的作用:删除不存在文件时,不报错,顺序执行结束
其实看clean的语法,也算是一个规则,只不过没有依赖条件,只有目标和命令
3个自动变量
$@: 在规则的命令中,表示规则中的目标$^: 在规则的命令中,表示所有依赖条件$<: 在规则的命令中,表示第一个依赖条件(如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则)

模式规则:

静态模式规则:前缀表示对哪一个依赖条件去套用模式规则

伪目标:当你的工作目录下,有名为clean或者ALL这样的同名文件时,会影响make的判断
伪目标的作用是忽略这些干扰,都要被执行

自定义参数:让gcc编译的时候自动加上Wall、g等选项,$(myArgs)中的$作用是取变量

make命令选项:
-n:模拟执行make、make clean命令-f:指定文件执行make命令,make -f m6
ps:使用make命令时要注意文件名,比如对mymv.c进行make,正确命令应该是:make mymv,不要加上 .c
ctags读代码工具
生成
首先生成一个tags文件,组织目录内所有.c间函数调用关系
方法:在项目目录下输入命令 ctags -R .
命令
ctrl + ]:光标置于调用函数上,跳转至函数定义位置ctrl + t:返回到此前跳转位置ctrl + o:在左侧列出文件列表,再按一次关闭F4:在右侧列出函数列表,再按一次关闭