[沫忘录] Linux基础(gdb调试,makefile)

[沫忘录] Linux基础(gdb调试,makefile)

gdb调试

前提 gcc编译时要加命令行参数 -g

进入 gdb + 加参编译后的可执行文件

gdb状态

l(list) 列处包含main函数的源文件(默认列处10行,回车继续) 后面加源文件名会列出该源文件,加**:**后再加具体函数名会列出该函数的内容。

b(break) number 设置断点 后面加if (i == 15) 设置条件断点

d(delete) + 变量编号 可以取消为该编号的断点行数

i(info) 查看信息 后面加b 查看断点信息

start 只执行一步 n 下一步(next)

r(run) 直接运行,有断点停止

c(continue) 继续执行,遇到断点停止

s 进入函数体内 + l 查看其详细内容

p(print) + 具体变量名 可以追踪其内容。

ptype + 具体变量名 可以查看其数据类型

display + 具体变量名 可以每步都打印其信息 undisplay + 编号 可以取消追踪为该编号的变量

info display 则可以查看被追踪变量的具体编号

u 跳出该循环(c中的break)

finish 跳出当前函数,回到主函数(前提: 去掉跳出该函数时可能会遇到的断点)

set + 变量名(赋值操作) 可以直接设置该变量的值

quit 跳出gdb状态


makefile

makefile三要素

目标(生成的可执行文件名) 依赖(待编译的源文件) 命令(具体实施步骤)

#目标: 依赖条件
#	(有tab缩进)命令
app:main.c file1.c file2.c
	gcc main.c file1.c file2.c -o app
#最简单的makefile文件

如果我们使用makefile文件编译了多次,为了防止重复编译,我可以将依赖分开(能够直接比较目标和依赖的修改日期来达到目的)

app:main.o file1.o file2.o
main.o:main.c 
	gcc -c main.c 
#这是生成二进制文件的命令
file1.o:file1.c
	gcc file1.c -o file1.o
#两种写法皆可
file2.o:file2.c
	gcc -c file2.c

命令执行

make 在有makefile和源文件的文件夹中,命令行使用该命令可以直接生成可执行文件. 当然如果makefile文件没有命名成makefile或Makefile, 我们可以通过加参来达到使用makefile文件的目的。

make -f makefile_namebyself

make clean 该命令可以执行makefile下的定义的清除操作. 具体操作内容的书写方法如下:

.PHONY : clean
#添加伪目标是防止同目录下存在clean文件影响命令执行
clean:
	rm app main.o file1.o file2.o

自定义操作的一些参数

- 该参数表示该命令执行错误时,跳过该命令执行后面的命令.

@ 该参数表示该命令执行时不会将执行过程打印在终端上.

两个命令都是加在命令前的, 例如:

-rm app main.o

makefile中的变量

像编程语言一样,makefile中也可以定义变量来简化书写.

obj = main.o file1.o file2.o

当我们要使用该变量时,使用如下方法取出该变量里面的值:

$(obj)
obj = $(obj)

有一些系统自带的变量,这些变量通常都是大写,这些变量中有些默认值,但都支持修改。

例如: CC, PWD, CFLAG

自动变量

makefile中提供了许多比较方便的自动变量,常用的有如下:

$@ 规则中的目标

$< 规则中的第一个依赖

$^ 规则中的所有依赖

%.c/%.o 规则中所有的该类依赖

所以上面makefile文件中向下寻找依赖的代码可简写成以下形式:

%.o:%.c
	$(CC) -c $^ -o $@

这种书写形式也被称作模式规则.

函数

makefile中有大量函数,经常使用的有如下三个:

wildcard 用于展开某文件的信息.

#示例用法
obj = $(wildcard ./src/*.c)
#查找src目录下的所有c源文件,并路径信息赋值给变量obj

notdir 将路径信息直接更改成文件名

#示例用法
file = $(notdir $(obj))
#将obj里的路径信信息替换成文件名

patsubst 替换通配符.

#示例用法
obj = $(patsubst %.c, .%.o, $(src))
#将src目录下的所有.c文件替换成.o文件,并将.o文件赋值给obj1变量.
#这里的替换不是直接修改文件格式,而是将文件字符串修改并返回,目的是为了方便书写.
#效果相似于
obj = $(file:%.c = %.o)
#将变量中c源文件替换成二进制源文件

你可能感兴趣的:(linux,运维,服务器)