首先 -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看看查看内容来调试;
提前是打好断点 生成可调式的程序 gcc test.c -g -o test/gcc -g test.c -o test
再使用 gdb test(gdb 目标文件) 前提yum 了gdb
info break 显示所有断点信息
事后测试
测试核心转储文件
我们发现 段错误 吐核了 coredump了可以提理解为临终遗言
看下图
图和文件呢 ? ll指令 没发现啊 !!
使用 ulimit -a 看看信息
我们发现 core file size 0 最大为 0 这当然不行啊 我们要吐文 件,使用 ulimit -c unlimited 设置为最大无限制
使用ulimit -c unlimited 将core dump 文件设置为大小不受限制,
看看 发现设置成功!
再执行 一下看看 产生 core dump文件没
发现确实产生了core dump文件!
core.24025 后边 这个数字为进程的程序id,简称 PID
直接打开发现是二进制文件,看不懂
采用gdb 模式打开
看倒数几行分析
若还是不清晰 ,可以继续 bt 分析。
很清楚 12行代码 走到5行就有问题了
放到进程的学习中再写
3 cgdb 需要yum install一下 ,稍微能方便下
发现了没 ,调试能方便舒适一丢丢了 ,多了当前走到哪的箭头 和加红
这是个40年前的技术,我觉得应该不会让我们手写,但还应该得了解下
Linux 项目自动化构建工具
make/Makefile M大小写都可以
上图test写错了
修改后执行
vim 在打开一个文件时会实时备份一份swap文件,防止异常丢失文件。
make之后修改 再make
make之后 不修改再make
差别很明显了吧!!!
这就是 增量编译和全量编译 他们执行时间差别特别大
Go 语言速度大大快的多 ,但是好奇怪,Int在后边等等。
后缀:.gcc(Linux程序) .inc(编译命令) .mvc(windows程序)
目标对象 :依赖对象
**解释规则:(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 $@ 目标对象
3 $< 依赖的第一个对象
makefile
out: test.c 目标对象:依赖对象
gcc test.c -o.out
clean://为了清楚目标,执行时直接走这一步的
rm out
来看一个“扯淡”的例子(其实是makefile的自动补全(若没有找源文件名相同的进行编译))
out: test.o
gcc test.o -o out //我们一般认为不可执行。但这里却能执行
test.o :test.c
gcc -c test.c -o test.o
这正是 makefile 的厉害之处 ,————自动补全。查找匹配,替换。
下面附加一个Linux 下的小程序 进度条程序
缓冲区 -------------------> 显示器
1 满了
2 遇见 \n
3 程序结束(写入文件例外)
vim 下怎么批量注释代码?
1 ctrl +v (列) shift+v (行) 进入视图模式
2 拖动光标 选中要注释的行或列
3 安 i 进入插入模式
4 安 //
5 安 esc 键
sleep (3) 为linux 下的函数 ,每隔三秒打印一个;
我们发现 显示器显示 不太好;我们改改
这个代码在 xshell下和 centos7下运行结果不一样 ,真奇怪!!