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
- 根据跟踪变量的编号,取消设置跟踪变量:
undisplay
2
注:栈帧是随着函数调用而在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
:在右侧列出函数列表,再按一次关闭