< 7 > Linux 开发工具:git 版本控制器 和 cgdb/gdb 调试器

[1.git 版本控制器 的 概念 和 意义](#1.git 版本控制器 的 概念 和 意义)

[2. Linux 中 git 操作流程](#2. Linux 中 git 操作流程)

[2.1 gitee 远端 创建仓库](#2.1 gitee 远端 创建仓库)

[2.2 管理 git 远程仓库](#2.2 管理 git 远程仓库)

[2.3 Linux 利用 git 命令 拉取本地仓库](#2.3 Linux 利用 git 命令 拉取本地仓库)

[2.30 git --version](#2.30 git --version)

[2.31 sudo yum/apt install -y git](#2.31 sudo yum/apt install -y git)

[2.32 git clone [仓库网址]](#2.32 git clone [仓库网址])

[2.33 仓库就是目录,远端仓库内容都会在其中](#2.33 仓库就是目录,远端仓库内容都会在其中)

[2.34 clone 报错处理](#2.34 clone 报错处理)

[2.4 .git 是真正的仓库,它会记录修改记录id](#2.4 .git 是真正的仓库,它会记录修改记录id)

[2.5 git 三板斧 ------ 测试修改id,代码变化,本地远端同步](#2.5 git 三板斧 —— 测试修改id,代码变化,本地远端同步)

[git 三板斧 ------ add ,commit ,push](#git 三板斧 —— add ,commit ,push)

[git add [路径] ------ 把工作区的修改,提交到暂存区](#git add [路径] —— 把工作区的修改,提交到暂存区)

[git commit -m "提交日志,必须好好写" ------ 把暂存区内容,提交到本地仓库(.git保存修改id)](#git commit -m "提交日志,必须好好写" —— 把暂存区内容,提交到本地仓库(.git保存修改id))

[git push ------ 将本地仓库修改内容,推送到远端仓库同步](#git push —— 将本地仓库修改内容,推送到远端仓库同步)

[.git 中修改记录的变化](#.git 中修改记录的变化)

[git 首次使用必须配置gitee用户名 + 邮箱](#git 首次使用必须配置gitee用户名 + 邮箱)

[git log ------ 查看提交信息,无法修改](#git log —— 查看提交信息,无法修改)

[git status ------ 查看本地仓库状态](#git status —— 查看本地仓库状态)

[3. git :工作区,暂存区,本地仓库](#3. git :工作区,暂存区,本地仓库)

[工作区:整个 git 所在目录,除了 .git](#工作区:整个 git 所在目录,除了 .git)

暂存区:意义是确认最终提交,以防可能修改错了

本地仓库:代码版本已被.git永久保存控制,随时可查看、推送

[4. .gitignore 配置文件 ------ 过滤掉指定后缀的文件](#4. .gitignore 配置文件 —— 过滤掉指定后缀的文件)

[5. 远端 / 本地仓库,需要先同步了再提交](#5. 远端 / 本地仓库,需要先同步了再提交)

[5.1 git pull ------ 同步 远端 与 本地仓库,避免覆盖别人修改的代码](#5.1 git pull —— 同步 远端 与 本地仓库,避免覆盖别人修改的代码)

[5.2 修改合并 ------ 远端与本地,都修改了同一个文件,需要我们自己处理如何处理](#5.2 修改合并 —— 远端与本地,都修改了同一个文件,需要我们自己处理如何处理)

[6. gdb / cgdb 调试器](#6. gdb / cgdb 调试器)

[6.1gdb / cgdb是什么? ------ 指令,用于调试](#6.1gdb / cgdb是什么? —— 指令,用于调试)

[6.2 软件分release和debug版本](#6.2 软件分release和debug版本)

[6.3 gcc -g ------ 生成debug版](#6.3 gcc -g —— 生成debug版)

[7. gdb / cgdb 调试器 怎么用?](#7. gdb / cgdb 调试器 怎么用?)

[7.1 cgdb: 与gdb指令一致,调试体验更好](#7.1 cgdb: 与gdb指令一致,调试体验更好)

[7.2 cgdb [debug版本程序] ------ 进入调试界面](#7.2 cgdb [debug版本程序] —— 进入调试界面)

[7.3 调试器只是一个辅助工具------不要为了调试而调试](#7.3 调试器只是一个辅助工具——不要为了调试而调试)

[7.4 cgdb 调试器 的常用指令](#7.4 cgdb 调试器 的常用指令)

[7.41 list / l + [行号] ------ 显示附近源代码](#7.41 list / l + [行号] —— 显示附近源代码)

[7.42 break / b + [行号] ------ 打断点,无法打空行,区域化的执行代码](#7.42 break / b + [行号] —— 打断点,无法打空行,区域化的执行代码)

​编辑

[7.43 info b ------ 查看端点信息,编号](#7.43 info b —— 查看端点信息,编号)

[7.44 run / r ------ 运行程序,遇到断点中止,没断点就结束](#7.44 run / r —— 运行程序,遇到断点中止,没断点就结束)

​编辑

[7.45 delete / d [断点编号] [断点编号]...------ 单次,批量化删除断点](#7.45 delete / d [断点编号] [断点编号]...—— 单次,批量化删除断点)

[7.46 disable [断点编号] ------ 保留断点,但失去作用](#7.46 disable [断点编号] —— 保留断点,但失去作用)

[7.47 enable [断点编号] ------ 启用断点,使能](#7.47 enable [断点编号] —— 启用断点,使能)

[7.48 c ------继续运行代码,遇到下一个断点中止,没断点就结束](#7.48 c ——继续运行代码,遇到下一个断点中止,没断点就结束)

[7.49 b 函数名 ------ 自动在函数内第一行打断点](#7.49 b 函数名 —— 自动在函数内第一行打断点)

[7.410 step / s ------ vs F11 ------ 逐语句执行,进入函数](#7.410 step / s —— vs F11 —— 逐语句执行,进入函数)

[7.411 next / n ------ vs F10 ------ 逐过程执行,不进入函数](#7.411 next / n —— vs F10 —— 逐过程执行,不进入函数)

[7.412 print / p [&][变量名] ------ 打印变量的地址或值](#7.412 print / p [&][变量名] —— 打印变量的地址或值)

[7.413 display [&][变量名] ------ 长时间展示变量内容或地址,便于观测变化](#7.413 display [&][变量名] —— 长时间展示变量内容或地址,便于观测变化)

[7.414 undisplay [编号1] [编号2]...------ 可单次,批量次删除常展示的变量](#7.414 undisplay [编号1] [编号2]...—— 可单次,批量次删除常展示的变量)

[7.415 until [行号] ------ 快速跳过栈帧内的循环,最多只能执行完当前函数,不会跳转函数外其他行](#7.415 until [行号] —— 快速跳过栈帧内的循环,最多只能执行完当前函数,不会跳转函数外其他行)

[7.416 finish ------ 执行当前函数,执行完就停止](#7.416 finish —— 执行当前函数,执行完就停止)

[7.417 backtrace / bt ------ 查看当前函数的调用栈,调用到哪里了](#7.417 backtrace / bt —— 查看当前函数的调用栈,调用到哪里了)

[7.418 info local ------ 展示局部变量的值](#7.418 info local —— 展示局部变量的值)

[7.419 p [表达式] ------ 可以打印表达式的值,用于计算数值,函数内可简单验证调试](#7.419 p [表达式] —— 可以打印表达式的值,用于计算数值,函数内可简单验证调试)

[7.5 cgdb 高级调试技巧](#7.5 cgdb 高级调试技巧)

[7.51 watch [变量名]------ 监测点,监测变量变化,发生变化会提示变化过程](#7.51 watch [变量名]—— 监测点,监测变量变化,发生变化会提示变化过程)

[7.52 set var [变量名]=[新内容]------ 动态修改源码的变量,方便直接编辑代码](#7.52 set var [变量名]=[新内容]—— 动态修改源码的变量,方便直接编辑代码)

[7.53 b [行号] if [变量]==[内容] ------ 条件断点满足条件,就断住程序,跳过部分循环](#7.53 b [行号] if [变量]==[内容] —— 条件断点满足条件,就断住程序,跳过部分循环)

[7.54 condition [断点编号] [变量名]==[内容] ------ 普通断点,追加为条件断点](#7.54 condition [断点编号] [变量名]==[内容] —— 普通断点,追加为条件断点)

[7.55 Esc / 滚轮 -> 代码屏,s+enter / i -> 调试屏](#7.55 Esc / 滚轮 -> 代码屏,s+enter / i -> 调试屏)

1.git 版本控制器 的 概念 和 意义

版本控制器 是 对代码,文件进行版本管理的工具,常用于团队开发项目,便于统一管理代码的版本

git 具有版本控制功能,具有网络同步功能。现在的gittub,gitee都是基于git

其意义:提高开发效率,方便管理项目、文件,推动开源浪潮发展

项目经过 -> 思路设计 -> 环境构建 -> 代码编写 -> 程序调试 -> 完成上线 几个步骤,并且大项目常常需要多人共同管理

没有版本控制器前,本地保存,拷贝上传,多人同步代码,多人修改代码,合并代码等操作,十分麻烦,并且每个都要手动管理,很大程度降低了开发效率。

人多起来,就更难管理,加上版本管理器基本都是闭源收费的软件,于是****大佬自己手写了开源免费软件的版本管理器------git

2. Linux 中 git 操作流程

2.1 gitee 远端 创建仓库

提一句:勾选设置模板,勾选readme . readme在开发中比较重要,

如其名:读我。 他是用来总结这个工程,或者是重要提醒的!

2.2 管理 git 远程仓库

2.3 Linux 利用 git 命令 拉取本地仓库

2.30 git --version

提供git版本信息,可用于比对版本,或者确认安装状态

2.31 sudo yum/apt install -y git

Linux 可以使用 git 的命令,可能没有下载,需要先用包管理器下载安装:

复制代码
sudo yum/apt install -y git

2.32 git clone [仓库网址]

2.33 仓库就是目录,远端仓库内容都会在其中

2.34 clone 报错处理

可能需要你输入gitee的账号密码。

2.4 .git 是真正的仓库,它会记录修改记录id

远端仓库 克隆 到本地,本质是一个拷贝。后面上传提交修改时,远端怎么知道我们修改了什么?

其实上面已经讲过,每次修改代码 / 文件内容,都会在内部记录下来,以 id 的形式记录每次修改

这些id记录,都存储在仓库文件的 .git 目录中:

2.5 git 三板斧 ------ 测试修改id,代码变化,本地远端同步

git 三板斧 ------ add ,commit ,push

git add [路径] ------ 把工作区的修改,提交到暂存区

git commit -m "提交日志,必须好好写" ------ 把暂存区内容,提交到本地仓库(.git保存修改id)

git push ------ 将本地仓库修改内容,推送到远端仓库同步

.git 中修改记录的变化

git 首次使用必须配置gitee用户名 + 邮箱

git log ------ 查看提交信息,无法修改

git status ------ 查看本地仓库状态

3. git :工作区,暂存区,本地仓库

git add : 把修改信息,从 工作区 提交到 暂存区(仓库)

git commit : 把修改信息,从 暂存区 提交到 本地仓库(.git,真正的仓库)

git push:本地仓库 和 远端仓库 同步

工作区:整个 git 所在目录,除了 .git

暂存区:意义是确认最终提交,以防可能修改错了

本地仓库:代码版本已被.git永久保存控制,随时可查看、推送

4. .gitignore 配置文件 ------ 过滤掉指定后缀的文件

忽略后缀用的配置文件。我们的项目哪怕hello.c ,都存在很多临时文件,他们是各种后缀

.slo,.log,.o,.i等。他们都不是我们需要提交的源文件.c,于是.gitignore出现了

目的就是便于筛选需要上传的文件,过滤掉指定后缀的文件

5. 远端 / 本地仓库,需要先同步了再提交

远端仓库 可能是多人管理,本地仓库只有自己管理

推送远端仓库时,本质是将 .git 中提交记录,版本,分支等修改的信息,同步到远端仓库

这是建立在,只有本地仓库发生变化,远端没发生变化的情况下。

如果远端同时也被别人修改了,两个仓库内容都发生了变化,贸然上传同步,只会覆盖掉远端中,别人修改的内容!

git 当然不允许这么做,就不会同意你 push,需要先pull ------ 同步远端与本地仓库

5.1 git pull ------ 同步 远端 与 本地仓库,避免覆盖别人修改的代码

5.2 修改合并 ------ 远端与本地,都修改了同一个文件,需要我们自己处理如何处理

由于同一个文件,被多个人修改了,git无法判断需要保留谁的代码

此时即便pull,也没用,git只会把两个修改都合并起来,简单分隔开,

然后提示你们,交给你们来讨论该怎么处理!

当项目管理十分糟糕时,难免会遇到这种情况。

6. gdb / cgdb 调试器

6.1gdb / cgdb是什么? ------ 指令,用于调试

gdb / cgdb 是调试器,类似于vs 2022的调试模式,它是Linux下的调试模式。

可以打断点,条件断点,查看局部,全局变量变化过程,可以区域化,精细化查看代码运行过程,进而帮助我把你发现问题。

Linux下一切皆文件,gdb / cgdb也不例外:他们都是文件,指令,二进制的可执行程序。
Linux平台可能本身不自带,需要用包管理器下载安装

6.2 软件分release和debug版本

软件分release和debug版本

release版本:内部不包含调试信息,无法调试。内存占用较小,运行较快

debug版本:内部包含部分调试信息,方便我们调试时查看信息,发现问题。内存占用较大,运行较慢

6.3 gcc -g ------ 生成debug版

gcc、g++编译,默认生成release版可执行程序

gcc -g 可生成debug版

7. gdb / cgdb 调试器 怎么用?

7.1 cgdb: 与gdb指令一致,调试体验更好

gdb 和 cgdb 内部指令基本一致,但cgdb是可视化版本,比gdb好观察,所以接下来主要讲解cgdb的用法

7.2 cgdb [debug版本程序] ------ 进入调试界面

7.3 调试器只是一个辅助工具------不要为了调试而调试

调试的本质是什么? 调试的本质就是帮助我们分析代码,解决问题

它本质就一个辅助工具。 调试的办法有很多:

可以自己cout打印日志,问Ai,使用搜索引擎,或者肉眼硬看。

调试器不是必备,只要能解决问题,就行,不要调试而调试。

7.4 cgdb 调试器 的常用指令

命令 作用 样例
list / l 显示源代码,从上次位置开始,每次列出 10 行 list / l 10
list / l 函数名 列出指定函数的源代码 list / l main
list / l 文件名:行号 列出指定文件的源代码 list / l mycmd.c:1
r / run 从程序开始连续执行 run
n / next 单步执行,不进入函数内部(逐过程,类似 F10) next
s / step 单步执行,进入函数内部(逐语句,类似 F11) step
break / b [文件名:] 行号 在指定行号设置断点 break 10 / break test.c:10
break / b 函数名 在函数开头设置断点 break main
info break / b 查看当前所有断点的信息 info break
finish 执行到当前函数返回,然后停止 finish
print / p 表达式 打印表达式的值 print start+end
p 变量 打印指定变量的值 p x
set var 变量=值 修改变量的值 set var i=10
continue / c 从当前位置开始连续执行程序 continue
delete / d breakpoints 删除所有断点 delete breakpoints
delete / d breakpoints n 删除序号为 n 的断点 delete breakpoints 1
disable breakpoints 禁用所有断点 disable breakpoints
enable breakpoints 启用所有断点 enable breakpoints
info / i breakpoints 查看当前设置的断点列表 info breakpoints
display 变量名 跟踪显示指定变量的值(每次停止时) display x
undisplay 编号 取消对指定编号的变量的跟踪显示 undisplay 1
until X 行号 执行到指定行号 until 20
backtrace / bt 查看当前执行栈的各级函数调用及参数 backtrace
info / i locals 查看当前栈帧的局部变量值 info locals
quit 退出 GDB 调试器 quit

7.41 list / l + [行号] ------ 显示附近源代码

7.42 break / b + [行号] ------ 打断点,无法打空行,区域化的执行代码

7.43 info b ------ 查看端点信息,编号

7.44 run / r ------ 运行程序,遇到断点中止,没断点就结束

7.45 delete / d [断点编号] [断点编号]...------ 单次,批量化删除断点

7.46 disable [断点编号] ------ 保留断点,但失去作用

7.47 enable [断点编号] ------ 启用断点,使能

7.48 c ------继续运行代码,遇到下一个断点中止,没断点就结束

7.49 b 函数名 ------ 自动在函数内第一行打断点

7.410 step / s ------ vs F11 ------ 逐语句执行,进入函数

7.411 next / n ------ vs F10 ------ 逐过程执行,不进入函数

7.412 print / p [&][变量名] ------ 打印变量的地址或值

7.413 display [&][变量名] ------ 长时间展示变量内容或地址,便于观测变化

7.414 undisplay [编号1] [编号2]...------ 可单次,批量次删除常展示的变量

7.415 until [行号] ------ 快速跳过栈帧内的循环,最多只能执行完当前函数,不会跳转函数外其他行

7.416 finish ------ 执行当前函数,执行完就停止

7.417 backtrace / bt ------ 查看当前函数的调用栈,调用到哪里了

7.418 info local ------ 展示局部变量的值

7.419 p [表达式] ------ 可以打印表达式的值,用于计算数值,函数内可简单验证调试

7.5 cgdb 高级调试技巧

7.51 watch [变量名]------ 监测点,监测变量变化,发生变化会提示变化过程

作用:监管住 不想被修改的值!比如指针

一旦发生变化,就会弹出提示,提醒你变化过程,你就知道它被修改了

info b 可查看 监测点: delete [断点编号] 正常删除

7.52 set var [变量名]=[新内容]------ 动态修改源码的变量,方便直接编辑代码

如果我们发现问题,是一个变量比如flag=0,需要更改为1,我们需要:

退出cgdb,vim打开源码,i插入模式,修改错误变量,退出vim,重新生成程序,运行...

这很麻烦!直接:set var flag=1 ,就完事了!

7.53 b [行号] if [变量]==[内容] ------ 条件断点满足条件,就断住程序,跳过部分循环

循环中,100次循环,每次都最后几次出错,就设置条件断点:当i == 97,触发断点,然后再逐语句,精细化调试,最后发现问题。

条件断点的作用就是快速跳过没问题的循环部分,解决了循环只有跳过和一步步的极端情况

同样的做法也可以是:手动设置条件断点:

不过麻烦,还得重新编辑,生成可执行程序,不如条件断点便捷。

复制代码
if (i == 90)
{
    int t = 0;  //设置一个语句,断点打这里,同样的效果
}

7.54 condition [断点编号] [变量名]==[内容] ------ 普通断点,追加为条件断点

7.55 Esc / 滚轮 -> 代码屏,s+enter / i -> 调试屏

经常光标跑上面去了,这是切换方法。

相关推荐
会编程的土豆1 小时前
洛谷题单 入门1 顺序结构(go语言)
开发语言·后端·golang·洛谷
jieyucx1 小时前
Go 语言 switch 条件语句详解
开发语言·c++·golang
AC赳赳老秦1 小时前
网安工程师提效:用 OpenClaw 实现漏洞扫描报告生成、安全巡检自动化、日志合规审计
java·开发语言·前端·javascript·python·deepseek·openclaw
初心未改HD1 小时前
Go语言defer机制深度解析
开发语言·golang
青木9601 小时前
前后端开发调试运行技巧
linux·服务器·前端·后端·npm·uv
万法若空1 小时前
C++ <iomanip> 库全方位详解
开发语言·c++
c++之路1 小时前
C++ 模板
linux·开发语言·c++
幻影七幻1 小时前
js中send的作用和使用 $.ajax的作用
开发语言·前端·javascript
xcbrand1 小时前
餐饮品牌全案公司哪家可靠
运维·python