【Linux】Linux开发工具(yum、gdb、git)详解

一、软件包管理器 yum

1、什么是软件包

  • 在 Linux 下安装软件,通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。
  • 但这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成在 Windows 上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。
  • 软件包和软件包管理器,就好比 "App" 和 "应用商店" 这样的关系。
  • yum(Yellow dog Updater, Modified) 是 Linux 下非常常用的一种包管理器。主要应用在 Fedora,RedHat,Centos 等发行版上。

Linux 下安装软件的方式:

  • 源代码安装。

  • rpm 包安装。

  • yum 工具(yum 是一条命令)。

【总结】

yum 是什么?

在 Linux 中下载资源的一种工具,类似于手机上的应用商店。

yum 可以为我们提供什么服务呢?
  • 查找、安装、卸载资源。
  • 解决依赖关系。

在手机应用商店上面搜索下载软件,本质是在该公司的后端服务器上搜索下载软件。

那么应用商店如何知道该去哪个服务器上下载软件呢?
  • 这个应用商店在本地一定有相关软件的配置信息(比如软件名和其对应的下载链接)。
  • 所以 yum 工具中一定也有配置文件,指明我们应该去哪里下载资源。

2、查看、安装和卸载软件包

(1)查看软件包(yum list)

通过此命令可以罗列出当前一共有哪些软件包。由于包的数目非常之多,一般配合管道(grep 命令)筛选出我们关注的包。

例如:

cpp 复制代码
$ sudo yum list | grep lrzsz

结果如下:

cpp 复制代码
# 软件包的名称和版本
lrzsz.x86_64                             0.12.20-36.el7                @os 

注意

  • 第 1 列:软件包名称,主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。
  • "x86_64" 后缀表示 64 位系统的安装包,"i686" 后缀表示 32 位系统安装包,选择包时要和系统匹配。
  • 第 2 列:"el7" 表示操作系统发行版的版本,"el7" 表示的是 centos7/redhat7。
  • 第 3 列:表示的是 "软件源" 的名称,即该软件包的发布方,类似于 "微信官网","华为应用商店" 这样的概念。

(2)安装软件(yum install)
cpp 复制代码
$ sudo yum install -y sl # 一个好玩的东西,可以在屏幕上跑一个小火车

yum 会自动找到都有哪些软件包需要下载,-y 表示直接安装,中途不需要确认。出现 complete! 的字样说明软件安装完成。

注意

  1. 安装软件时由于需要向系统目录中写入内容,一般需要 sudo 命令或者切到 root 账户下才能完成。
  2. yum 安装软件只能一个装完了再装另一个。在 yum 安装一个软件的过程中,如果再尝试用 yum 安装另外一个软件,yum 会报错。

(3)卸载软件(yum remove)
cpp 复制代码
$ sudo yum remove -y sl # 卸载sl软件以及它的依赖包

更新 yum 源

yum 的配置文件 /etc/yum.conf,这个一般不要去改动。

在 yum 配置路径下,会有 yum 源:

cpp 复制代码
[ll@VM-0-12-centos 5]$ ls /etc/yum.repos.d/ # 查看yum源
CentOS-Base.repo  CentOS-Epel.repo  epel.repo  epel-testing.repo

# CentOS-Base.repo: yum源,要求软件可靠稳定才能放进yum源中,这里的软件版本迭代比较慢
# CentOS-Epel.repo: 扩展源,比如某个软件新开发的版本,就可以放到epel源中

在 CentOS-Base.repo 文件中可以进行软件源(即软件的下载链接)的配置,当你使用 yum install 安装软件时,就会去对应的服务器上下载软件。

执行 vim /etc/yum.repos.d/CentOS-Base.repo


3、关于 rz / sz 工具

(1)功能

这个工具用于本地 Windows 机器和远端的 Linux 服务器通过 XShell 传输文件。

安装完毕之后可以通过拖拽的方式将文件上传过去。

安装 rz / sz 工具:

cpp 复制代码
$ sudo yum install -y lszrz  # lszrz是要安装的软件名称

安装完毕之后可以通过拖拽的方式将文件上传过去。


(2)用法

1、rz 命令,上传 Windows 中的文件到远端 Linux 服务器中:

cpp 复制代码
$ rz # 运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器,上传到服务器的路径为当前执行rz命令的目录。

2、sz 命令,将选定的文件发送到本地 windows 机器:

cpp 复制代码
$ sz filename # filename是文件名

二、Linux 开发工具调试器 gdb

1、背景

  • 程序的发布方式有两种:debug 模式和 release 模式。
  • Linux gcc / g++ 出来的二进制程序,默认是****release 模式
  • 要使用 gdb 调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。
cpp 复制代码
$ gcc test.c -o test_debug -g

2、基本概念

  • 程序的发布的两种模式:

    • debug 模式(在生成可执行程序的时候,会加入调试信息,可调试)。
    • release 模式(没有调试信息,不可被调试)。

Linux gcc / g++ 编译生成的 release 版本和 debug 版本的可执行程序区别:


3、基本操作

gdb 命令格式:gdb [目标文件名]

这些基本操作中,常用操作都在下面举了例子,例子也是大致按照调试步骤来排列的。

  • list/l + 行号:显示程序源代码,接着上次的位置往下列,每次列 10 行。
cpp 复制代码
(gdb) list 1  # 从第一行代码开始显示。接着按回车键,会继续往下显示代码,每次列10行。
  • list/l + 函数名:列出某个函数的源代码。(比如:l main 列出 main 函数的代码)

  • b / break + 行号:在某一行设置断点。

cpp 复制代码
(gdb) b 7
Breakpoint 1 at 0x400543: file test.c, line 7. # 断点1位于0x400543:文件test.c,第7行
  • break 函数名:在某个函数开头设置断点。(实际上是这个断点是打在该函数的第一行)

  • info b:查看断点信息。当前设置了哪些断点。

cpp 复制代码
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400543 in main at test.c:7  # 第7行
2       breakpoint     keep y   0x0000000000400555 in main at test.c:10 # 第10行
  • r 或 run:开始调试,如果没有设置断点,就直接运行结束。(断点打完了,该如何让程序执行起来,开始调试呢?相当于 VS 中的 F5)
cpp 复制代码
(gdb) r
Starting program: /home/ll/xxxx/test_debug 

Breakpoint 1, main () at test.c:7  # 此时来到了第一个断点处(第7行)
7	  for (; i < 10; i++) {
(1)问题:此时我想跳到第二个断点去调试程序,该怎么办呢?
  • continue / c:从当前位置开始连续而非单步执行程序。(运行至下一个断点处停下来)
cpp 复制代码
(gdb) continue
Continuing.

Breakpoint 2, main () at test.c:10 # 此时来到了第二个断点处(第10行)
10	  printf("sum = %d\n", sum);
  • n 或 next:单条执行。(逐过程 ,不会进入函数,相当于 VS 中的 F10
cpp 复制代码
(gdb) n
8	    sum += i; # 单步执行,此时来到了第8行
  • s 或 step:进入函数调用。(逐语句 ,会进入函数,相当于 VS 中的 F11

  • **print /**p + 变量:打印变量值。

cpp 复制代码
(gdb) p i
$1 = 3
(gdb) p sum
$2 = 3
(gdb) p &i
$3 = (int *) 0x7fffffffe44c
(gdb) p &sum
$4 = (int *) 0x7fffffffe448
(2)问题:我想要这些变量值随着调试的进行而不断变化,该怎么办呢?
  • display + 变量名:设置常显示。跟踪查看一个变量,每次停下来都显示它的值。
cpp 复制代码
(gdb) display i   # 跟踪查看变量i
1: i = 3
(gdb) display sum # 跟踪查看变量sum
2: sum = 3
(gdb) n    # 单步调试
7	  for (; i < 10; i++) {
2: sum = 6 # 显示变量i的值,前面的2:是它的序号
1: i = 3   # 显示变量sum的值,前面的1:是它的序号
  • undisplay + 序号:取消常显示。取消对先前设置的那些变量的跟踪。
cpp 复制代码
(gdb) undisplay 2
(gdb) undisplay 1
  • delete breakpoint:删除所有断点
  • delete / d Num:删除序号为 Num的断点。
  • disable Num:禁用断点。
  • enable Num:启用断点。
  • until X(指定行号):跳转到第 X 行。
  • finish:执行到当前函数返回,然后停下来等待命令。输入 finish 可直接结束当前函数调用,用此命令可以快速判断一个程序中到底是哪个函数出了 bug(此命令在非 main 函数中才有效)。
cpp 复制代码
(gdb) finish 
Run till exit from #0  Sum (n=10) at test.c:4
0x0000000000400609 in main () at test.c:18
18	  int sum = Sum(n);   # 结束Sum函数调用,直接返回函数结果
Value returned is $1 = 55 # Sum函数的返回值
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数(print 中可以执行各种表达式)。
  • set var i = 100:修改变量 i 的值(比如在调试过程中,有一个 if 语句本来该进去的,结果没进去,所以我怀疑是不是变量的值有问题,就通过这种方式来修改变量的值,观察它是否会进入这个 if 语句)。
  • bt / breaktrace:查看各级函数调用及参数(相当于 VS 中的查看调用堆栈)。
cpp 复制代码
(gdb) bt     # 查看调用堆栈,main函数上面压的是SUm函数
#0  Sum (n=10) at test.c:4
#1  0x0000000000400609 in main () at test.c:18
  • info(i) locals:查看当前栈帧局部变量的值

  • q / quit:退出 gdb。

注意:调试程序完毕,或者调试中间过程,调试痕迹很重要,当调试一个大的项目,可能有几十个断点,某个断点调试完了,不要直接把它删除,而是暂时禁用它,等程序没有任何问题了,再把所有断点删除。


三、Linux 开发工具分布式版本控制软件 git

1、背景

git 是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于 2005 年以 GPL 许可协议发布。最初目的是为了更好地管理 Linux 内核开发而设计。


2、使用 git

(1)预备工作

安装 git:

cpp 复制代码
$ sudo yum install -y git

在 gitee / github 创建新仓库,然后在创建好的仓库页面中复制远程仓库的地址 url,推荐 HTTPS。


(2)克隆远程仓库到本地
cpp 复制代码
$ git clone [url] # 这里的url就是刚刚建立好的仓库的链接

执行命令后,输入 gitee / github 的用户名和密码,将会直接在本地创建一个放置代码的目录。

仓库中的内容(注意:不要修改隐藏文件 .git 里面的内容):


(3)把需要提交的代码拷贝到本地仓库

(4)三板斧(提交本地仓库文件到远程仓库)
cpp 复制代码
# 添加所有文件到暂存区,将需要用git管理的文件告知git
$ git add .

# 提交文件到本地仓库,""中写提交日志,不能乱写,描述改动的详细内容
$ git commit -m "first commit"

# 推动本地仓库的文件到远程仓库,即同步到远端服务器上
$ git push origin master

最后的 "." 表示当前目录。

最后一步需要填入用户名密码。同步成功后,刷新页面就能看到代码改动了。

执行 git commit -m "msg" 时,会让你设置用户名和邮箱(每次 git 提交都会使用到该信息,它被永远的嵌入到了你的提交中):

cpp 复制代码
$ git config --global user.email "you@example.com" # 邮箱
$ git config --global user.name "Your Name"        # 用户名

当依次执行三个命令后,输入 gitee/github 的用户名和密码,在 gitee/github 上的远程仓库刷新就可以看到自己的代码啦。


(5)配置免密码提交

git本地免密码和账号pull、push_没有git账号怎么拉代码-CSDN博客


(6)补充
cpp 复制代码
$ git log    # 查看所有提交日志信息
$ git status # 查看本地仓库所有文件状态
相关推荐
小兔崽子去哪了15 分钟前
Git 专题
git
金米kk28 分钟前
git pull时报错Your local changes to the following files would…的解决办法
git
学好statistics和DS28 分钟前
命令替换(Command Substitution)详解
linux
zimoyin28 分钟前
浅浅了解下0拷贝技术
java·linux·开发语言
超级罗伯特29 分钟前
git一次性完成仓库下载及所有分支获取
git·git仓库拉取
ba_pi43 分钟前
每天写点什么2026-01-09-linux基础
linux·运维·服务器
BUTCHER51 小时前
Git 基础命令
git
M malloc1 小时前
当你有两个git账号时,此时你gitpush冲突后如何解决push问题
git
wdfk_prog1 小时前
[Linux]学习笔记系列 -- 底层CPU与体系结构宏
linux·笔记·学习
行走的bug...1 小时前
cmake总结
linux·运维·服务器