linux 的调试工具gdb 和工程管理工具make/Makefile

首先 -g :编译的时候保留调试信息

O0-O1 -O2 -O3
O1 : 缺省值
O2 : 业界公认的优化
O3 : 优化比较激进
优化级别越高,执行顺序就跟原始顺序差别越大,所以最好关闭优化再执行
默认-O1

gdb :常用指令
break(b) 打断点
info break
step(f11)逐语句
next(f10) 逐过程
breaktrace(bt) 查看堆栈的调用
frame(f) 切换到指定的堆栈
常用 第一步 ; bt (breaktrace) 查看栈帧
第二步 f (frame) 切换栈帧,本层为 1 ,从本层依次向外层位 23456789…可以p看看查看内容来调试;
linux 的调试工具gdb 和工程管理工具make/Makefile
linux 的调试工具gdb 和工程管理工具make/Makefile

linux 的调试工具gdb 和工程管理工具make/Makefile
提前是打好断点 生成可调式的程序 gcc test.c -g -o test/gcc -g test.c -o test

再使用 gdb test(gdb 目标文件) 前提yum 了gdb
info break 显示所有断点信息

事后测试

测试核心转储文件
linux 的调试工具gdb 和工程管理工具make/Makefile
linux 的调试工具gdb 和工程管理工具make/Makefile
我们发现 段错误 吐核了 coredump了可以提理解为临终遗言

看下图
图和文件呢 ? ll指令 没发现啊 !!
使用 ulimit -a 看看信息
我们发现 core file size 0 最大为 0 这当然不行啊 我们要吐文 件,使用 ulimit -c unlimited 设置为最大无限制
linux 的调试工具gdb 和工程管理工具make/Makefile

使用ulimit -c unlimited 将core dump 文件设置为大小不受限制,

linux 的调试工具gdb 和工程管理工具make/Makefile
看看 发现设置成功!
再执行 一下看看 产生 core dump文件没
linux 的调试工具gdb 和工程管理工具make/Makefile
发现确实产生了core dump文件!
core.24025 后边 这个数字为进程的程序id,简称 PID

直接打开发现是二进制文件,看不懂
采用gdb 模式打开
linux 的调试工具gdb 和工程管理工具make/Makefile
看倒数几行分析
若还是不清晰 ,可以继续 bt 分析。linux 的调试工具gdb 和工程管理工具make/Makefile
很清楚 12行代码 走到5行就有问题了

2 使用gdb attach一个程序 (附加一个程序)

放到进程的学习中再写
3 cgdb 需要yum install一下 ,稍微能方便下

linux 的调试工具gdb 和工程管理工具make/Makefile

linux 的调试工具gdb 和工程管理工具make/Makefile

发现了没 ,调试能方便舒适一丢丢了 ,多了当前走到哪的箭头 和加红

2 工程管理工具/目自动化构建工具 make/Makefile

这是个40年前的技术,我觉得应该不会让我们手写,但还应该得了解下
Linux 项目自动化构建工具
make/Makefile M大小写都可以
linux 的调试工具gdb 和工程管理工具make/Makefile
上图test写错了
修改后执行
linux 的调试工具gdb 和工程管理工具make/Makefile

vim 在打开一个文件时会实时备份一份swap文件,防止异常丢失文件。

make之后修改 再make
linux 的调试工具gdb 和工程管理工具make/Makefile
make之后 不修改再make
linux 的调试工具gdb 和工程管理工具make/Makefile
差别很明显了吧!!!
这就是 增量编译和全量编译 他们执行时间差别特别大
Go 语言速度大大快的多 ,但是好奇怪,Int在后边等等。

后缀:.gcc(Linux程序) .inc(编译命令) .mvc(windows程序)

目标对象 :依赖对象

linux 的调试工具gdb 和工程管理工具make/Makefile
**解释规则:(3条)**即上图
1 makefile解释规则只为第一个对象服务 ,满足就停
2 如果找不到目标对象的依赖对象,则在makefile中查找生成依赖对象的方法
3 如果目标对象最后修改的时间比依赖对象近,则不生成目标对象,反之生成对象。
4 如果定义成伪目标(中途能生成依赖对象进而生成目标对象),则不必关心目标对象和依赖对象的时间,直接执行make

make 顺利执行,生成了可执行程序

清理 :(make clean 会直接执行 内部的clean 不必经过第一个目标对象)
clean ????/清理目标对象
rm out
使用时 直接用 make clean
clean 只是为了执行某个动作,而不是为了生成文件,如果有一个名叫clean 的文件,就会影响 make clean的执行**,这时,就用 .PHONY把 clean声明为伪目标**

1一个makefile 中可以存在多个对象,但不一定都要生成,有的只是为了完成特定的动作。
2 多个目标对象 默认只生成第一个目标对象

预定义变量

1 $^ 所有依赖对象
2 [email protected] 目标对象
3 $< 依赖的第一个对象

makefile
out: test.c 目标对象:依赖对象
gcc test.c -o.out
clean://为了清楚目标,执行时直接走这一步的
rm out
linux 的调试工具gdb 和工程管理工具make/Makefile
linux 的调试工具gdb 和工程管理工具make/Makefile

linux 的调试工具gdb 和工程管理工具make/Makefile
linux 的调试工具gdb 和工程管理工具make/Makefile
来看一个“扯淡”的例子(其实是makefile的自动补全(若没有找源文件名相同的进行编译))

out: test.o
gcc test.o -o out //我们一般认为不可执行。但这里却能执行
test.o :test.c
gcc -c test.c -o test.o
这正是 makefile 的厉害之处 ,————自动补全。查找匹配,替换。

下面附加一个Linux 下的小程序 进度条程序

linux 的调试工具gdb 和工程管理工具make/Makefile
缓冲区 -------------------> 显示器
1 满了
2 遇见 \nlinux 的调试工具gdb 和工程管理工具make/Makefile
3 程序结束(写入文件例外)

vim 下怎么批量注释代码?
1 ctrl +v (列) shift+v (行) 进入视图模式
2 拖动光标 选中要注释的行或列
3 安 i 进入插入模式
4 安 //
5 安 esc 键

sleep (3) 为linux 下的函数 ,每隔三秒打印一个;
我们发现 显示器显示 不太好;我们改改

linux 的调试工具gdb 和工程管理工具make/Makefile

这个代码在 xshell下和 centos7下运行结果不一样 ,真奇怪!!