Linux基础入门(四)
Makefile
规则
Makefile的框架由规则构成。make命令执行时先在Makefile文件中查找各种规则,对各种规则进行解析后运行规则。
1 | #每条规则的语法格式: |
每条规则由三个部分组成,分别是目标(target),依赖(depend)和命令(command)。
- 命令(command):当前这条规则的动作,一般情况下是一个shell命令。
- 例如:通过某个命令编译文件,生成库文件,进入目录等。
- 动作可以是多个,每个命令前必须有一个tab并且独占一行
- 依赖(depend):规则所必需的依赖条件,在规则的命令中可以使用这些依赖。
- 可以为空,可以是其他规则中的某个目标,可以指定多个。
- 目标(target):规则中的目标,这个目标和规则中的命令是对应的
- 通过执行命令,可以生成一个和目标同名的文件。
- 规则中可以有多个命令,因此可以有多个目标。
1 | #单个目标,单个命令 |
工作原理
文件时间戳
make命令执行时会根据文件的时间戳判定是否执行makefile文件中相关规则的命令。
- 目标是通过依赖生成,所以正常情况下:目标时间戳>所有依赖的时间戳,如果执行make命令的时候检测到规则中的目标和依赖满足这个条件,那么规则中的命令就不被执行。
- 当依赖文件被更新时,目标时间戳<某些依赖的时间戳,在这种情况下目标文件会被重新生成。
- 如果目标文件不存在,规则中的命令看到会被执行。
自动推导
make有自动推导的能力,不会完全依赖makefile。
makefile内容:
前五条命令为make自动推导的结果。
GBD
调试准备
生成可用于调试的可执行文件
1 | gcc test.c -g -Wall -O0 -o app |
使用gdb 进行调试
1 | gdb app |
设置命令行参数
1 | # 执行到第一个断点,如果没有设置断点,程序直接执行完 |
run命令,没有断点则直接执行完程序。
查看代码
当前文件
1 | # 从第一行开始显示 |
切换文件
1 | l 文件名:行号 |
设置显示的行数
1 | # 以下两个命令中的 listsize 都可以写成 list |
断点操作
设置断点
断点的设置有两种方式,一种是常规断点,程序只要运行到这个位置就会被阻塞;还有一种叫条件断点,只有指定的条件被满足了程序才会在断点处阻塞。
设置普通断点到当前文件
1 | # 在当前文件的某一行上设置断点 |
设置普通断点到某个非当前文件上
1 | # 在非当前文件的某一行上设置断点 |
设置条件断点
1 | b 行数 if 变量名==某个值 |
查看断点
1 | info breakpoint |
删除断点
1 | # delete == del == d |
设置断点状态
1 | #设置断点无效 |
编号6的断点Ebh变为n
调试命令
继续运行gdb
1 | # continue = c |
打印变量值
1 | # print = p |
打印变量类型
1 | ptype 变量名 |
自动打印信息
1 | display 变量名 |
1 | #删除自动显示 |
单步调试
执行下一行,如果是函数调用,则会进入到函数体内部。
1 | # step == s |
跳出函数体
1 | finish |
执行下一行,不会进入函数体内部
1 | #next == n |
跳出循环体。循环体内无有效断点。
1 | until |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Krito's Blog!
评论