第23天Linux下常用工具(二)

devtools/2024/11/14 0:25:32/

目录

第四章 GDB调试工具

4.1gdb的作用

4.2调试代码的流程

4.3gdb的安装

4.4 gdb的使用

第五章 makefile工程管理工具

5.1makefile的作用

5.2makefile的运行

5.3make的安装

5.4makefile的编写方法

5.5makefile的语法

5.6makefile使用示例


第四章 GDB调试工具

4.1gdb的作用

代码调试工具,可以帮助调试代码

替代刚入门时使用一句一printf的调试方法,来找到代码出问题的地方

4.2调试代码的流程

测试:发现问题

定位:通过标志提示或删除功能,定位出问题的大概位置

修改:分析问题,改正问题

测试:验证结果

4.3gdb的安装

sudo apt-get install gdb

在线安装gdb

4.4 gdb的使用

4.4.1准备工作

gdb调试的代码,需要使用gcc的-g参数生成可执行文件的gdb

gcc -g main.c -o maingdb

4.4.2启动gdb

常规启动:

gdb ./maingdb

主函数传参启动:

方法一:

gdb --args ./maingdb 参数1 参数2...

方法二:在开启gdb之后,启动程序之前:

set args 参数1 参数2...

方法三:在开启gdb之后,启动程序之前:

run 参数1 参数2 ...

4.4.3退出gdb

退出gdb指令:q

4.4.4显示代码指令:list 或 l(小写 L)

l n #显示第 n 行附近的代码

例如查看12行附近的代码 

 4.4.5连续运行指令:run或r

代码从头开始执行,一直到结束停止,或者运行到断点位置暂停

遇到主函数传参(例如计算器程序中):r 10 + 20

argv[0]==r

argv[1]==10

argv[2]==+

argv[3]==20

或者:在传参后  

4.4.6设置断点指令:break或b

b n#在第n行设置断点

 4.4.7查看断点指令

info b

这里可以主要关注Enb列和What列

 4.4.8失能断点指令:disable

失能只是不生效了,并没有删除

disable 断点编号

4.4.9使能断点指令:enable

让断点失能后,就有恢复的需要

enable 断点编号

4.4.10删除断点指令clear或delete

clear 断点行号
delete 断点编号

试一下clear: 

试一下delete:

4.4.11 继续运行指令:cont 或 c

4.4.12 打印变量当前的值指令:print

print 变量名 #打印变量的值

4.4.13 单步调试启动指令:start

自动调用上一次运行时传入的参数

4.4.14 单步执行指令: n 或 s

n(next):遇到子函数,不会进入子函数内部,以函数为单位执行

s(step):遇到子函数,会进入子函数内部,以语句为单位执行

常用操作:遇到库函数按 n,不能进入,否则会卡死 遇到普通函数按 s

第五章 makefile工程管理工具

5.1makefile的作用

工程管理工具:名字为makefile的文件

将准备在终端中执行的指令,写入到该文件中(按照规定语法格式写)

5.2makefile的运行

若执行的文件名为makefile:直接在终端键入make,即可自动执行makefile文件中写入的指令

若执行的文件未命名未makefile:终端键入make -f 文件名

5.3make的安装

sudo apt-get install make

在线安装make工具

5.4makefile的编写方法

编写思想:目标和依赖的关系。

首先构思如何通过依赖生成目标,整个过程中一切指令都是为了生成最终目标

5.5makefile的语法

5.5.1注释

#注释

5.5.2 语法一

makefile中不能键入空格,只能键入Tab。否则无效。

目标:依赖命令        #通过依赖生成目标的命令

5.5.3 语法二

目标:命令        #可以直接执行的命令,不一定要得到目标

伪目标:没有依赖的目标

执行伪目标的指令:make 伪目标

5.5.4 变量
 

变量名=值         #定义变量
$(变量名)         #引用变量名对应的值

vim 底行模式:字符串自主选择替换--- :%s/gcc/$(cc)/gc

5.5.5 特殊变量

$@ 代表目标

$^ 代表所有依赖

$< 代表所有依赖中的第一个

% makefile 中的通配符

经过变量替换后,代码可以变成,除了计算机,大家都一眼看不懂的样子。

5.6makefile使用示例

这里我依然使用计算器的模块程序

首先实现静态库封装

inc=./inc
src=./src
out=./output
libpath=./lib
libname=static    #以上都是变量替换main:main.c $(libpath)/lib$(libname).agcc $< -l$(libname) -L$(libpath) -o $@ -I$(inc)@echo 编译完成./main 1 + 1
$(libpath)/lib$(libname).a: $(out)/add.o $(out)/jian.oar -rc $@ $^@echo 静态库制作完成
$(out)/%.o:$(src)/%.cgcc -c $< -o $@ -I$(inc)
clean:rm $(out)/*.o main $(libpath)/lib$(libname).a

其次,实现动态库封装

main:main.c ./lib/libmove.sosudo mv ./lib/libmove.so /usr/libgcc main.c -lmove -I./inc -o main./main 1 + 1
./lib/libmove.so:./output/add.o ./output/jian.ogcc -shared -fpic -o $@ $^
./output/%.o:./src/%.cgcc -c $< -o $@ -I./inc
clean:rm ./lib/libmove.so ./output/*.o main

整个工程管理有点倒置执行的意思,但总共执行那编译四步、编译两步,理清执行顺序就可以。


http://www.ppmy.cn/devtools/133779.html

相关文章

【爬虫分享】

爬虫分享 1、爬虫科普 视频发送于2024-10-27 14 _50.mp4 全屏预览下载附件 所以 爬虫 其实是非常 可“刑” 可“铐” 的。 2、逆向方法 算法还原 补环境 无头浏览器&#xff08;自动化&#xff09; rpc 参数生成速度&#xff1a;算法还原 > 补环境 > rpc > 无头…

基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;番茄成熟度检测在农业生产及质量控制中起着至关重要的作用&#xff0c;不仅能帮助农民及时采摘成熟的番茄&#xff0c;还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型&#xff0c;该模型使用了…

王珊数据库系统概论第六版PDF+第五版课后答案+课件

为了保持科学性、先进性和实用性&#xff0c; 编者在第5版教材基础上对全书内容进行了修改、更新和充实。在科学性方面&#xff0c; 编者在系统篇中增加了第9章关系数据库存储管理&#xff0c; 讲解数据库的逻辑与物理组织方式及索引结构。增加这部分内容有助于学生更好地理解关…

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block&#xff0c;pendding&#xff0c;handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢&#xff1f; 案例 信号处理 操作系统是如何运行的&#xff1f; 硬件中断 …

二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

Linux 经典面试八股文

快速鉴别十个题 1&#xff0c;你如何描述Linux文件系统的结构&#xff1f; 答案应包括对/, /etc, /var, /home, /bin, /lib, /usr, 和 /tmp等常见目录的功能和用途的描述。 2&#xff0c;在Linux中如何查看和终止正在运行的进程&#xff1f; 期望的答案应涵盖ps, top, htop, …

Redis中的线程模型

Redis 的单线程模型详解 Redis 的“单线程”模型主要指的是其 主线程&#xff0c;这个主线程负责从客户端接收请求、解析命令、处理数据和返回响应。为了深入了解 Redis 单线程的具体工作流程&#xff0c;我们可以将其分为以下几个步骤&#xff1a; 接收客户端请求 Redis 的主线…

《MYSQL45讲》误删数据怎么办

对误删数据分类的话&#xff0c;有 1.delete 误删行 2.drop table 或者truncate table 语句误删表 3.使用drop database 误删数据库 4.使用rm命令误删整个MYSQL实例 一&#xff0c;误删行 一下操作前置条件是&#xff1a;binlog的格式是row&#xff0c;并且binglog_row_im…