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看看查看内容来调试;
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
提前是打好断点 生成可调式的程序 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行就有问题了

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

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

在这里插入图片描述

在这里插入图片描述

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

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

这是个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下运行结果不一样 ,真奇怪!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值