当前位置: 首页 > news >正文

【Linux】 开发|Git 版本控制与 gdb/cgdb 调试


版本控制器 Git

1‑1 版本控制器

版本控制器(VCS),简单说就是代码的 “时光机”。 它记录文件每一次改动,保存完整历史快照,可以随时查看历史、回退旧版本,同时解决多人协同开发的代码合并问题。

版本控制器分两大类:

  1. 集中式版本控制 (SVN):所有版本存放在中央服务器,本地没有完整仓库,断网几乎无法工作。
  2. 分布式版本控制 (Git):每一台机器都拥有完整仓库副本,包含全部提交历史。远程仓库只是一份备份,本地可以完成绝大多数操作,断网也能提交版本。

Git 核心 4 个工作区域:

  • 工作区 (Working Directory):我们肉眼看到的项目文件
  • 暂存区 (Stage/index):临时存放要提交的修改
  • 本地仓库 (Local Repository):本地完整版本历史数据库
  • 远程仓库 (Remote Repository):Github/Gitee 等云端仓库

文件状态:未跟踪 → git add → 暂存 → git commit → 本地仓库 → git push → 远程仓库。


1‑2 Git 简史

Git 的作者是 Linus Torvalds,也就是 Linux 内核的创始人。

  • 在 2002‑2005 年间,Linux 内核团队使用商业版本控制系统 BitKeeper。
  • 后续商业方收回免费使用权,Linux 社区无法继续使用。
  • 2005 年,Linus 两周时间写出 Git 最初版本,目标明确:
    1. 速度快,适合管理千万行级别大型内核项目
    2. 完全分布式,不需要中央服务器
    3. 简单设计,支持分支、合并
    4. 完全开源免费

之后 Git 迅速发展,现在几乎成为全球项目的标配版本工具。


1‑3 安装 Git

Ubuntu / Debian
sudo apt update sudo apt install git
配置全局身份(必须配置,提交代码会带上你的名字邮箱)
# 设置用户名 git config --global user.name "your_name" # 设置邮箱(和github注册邮箱保持一致) git config --global user.email "your_email@xxx.com"

查看配置:

git config --global --list

--global代表全局配置,本机所有 git 仓库生效;去掉则只对当前仓库生效。


1‑4 在 Github 创建项目

方式 1:全新仓库,从远程克隆到本地
  1. 打开 Github 网页,点击New新建仓库
  2. 填写仓库名称、简介,选择 Public 公开 / Private 私有,不需要初始化 README(可选)
  3. 创建完成,复制仓库地址,支持两种协议:
    • HTTPS:每次 push 需要输入账号密码
    • SSH:配置密钥后免密码推送(推荐)
  4. 本地终端克隆仓库
git clone git@github.com:xxx/xxx_repo.git cd xxx_repo

方式 2:本地已有项目,关联 Github 远程仓库

进入本地项目文件夹

cd my_project git init #初始化本地git仓库,生成隐藏文件夹.git

关联远程仓库地址

git remote add origin git@github.com:xxx/xxx_repo.git

.git文件夹是整个版本库,不要手动修改删除。

常用远程仓库命令:

git remote -v #查看远程仓库信息 git remote remove origin #删除远程关联

1‑5 Git 三板斧(日常高频)

三板斧:git addgit commitgit push

git add:把工作区修改存入暂存区

git add main.c #只添加单个文件 git add src/ #添加整个文件夹 git add . #添加当前目录全部修改(慎用,确认没有多余文件)

git commit:把暂存区内容提交到本地仓库,生成版本快照

git commit -m "feat: 完成用户登录功能"

commit 信息尽量写清楚本次做了什么修改,方便后续回溯。


git push:将本地仓库提交推送到 Github 远程仓库

git push origin main

origin 是远程仓库别名,main 是分支名。


配套高频命令:

git status #查看当前文件状态(最常用) git log #查看提交历史记录 git pull #拉取远程最新代码到本地(多人协作必用) git diff #查看文件改动内容

简单工作流程:

修改代码 →git addgit commitgit push多人开发先执行git pull拉别人最新代码,避免冲突。


调试器 gdb /cgdb 使用

gdb:Linux 原生命令行调试器;

cgdb:gdb 前端,提供源码分屏界面,操作更友好。

C/C++ 开发,排查段错误、逻辑 bug、死循环,优先使用调试器,不要只靠 printf 打印。

2‑1 样例代码

⚠️重点:调试的程序编译必须加-g参数,加入调试符号,gdb 才能映射源码、打断点。

示例代码test.c

#include<stdio.h> int calc(int a,int b) { return a + b; } int main(void) { int i; int sum = 0; for(i = 1; i <= 10; i++) { sum += calc(i,2); } printf("sum=%d\n",sum); return 0; }

编译命令:

gcc -g test.c -o test_debug
  • -g:生成调试信息,程序体积会变大;正式发布版本去掉-g
  • 如果不加-g,gdb 无法看到源码,只能看汇编。

2‑2 预备工作

启动 gdb
gdb ./test_debug
启动 cgdb(可视化 gdb)
cgdb ./test_debug

cgdb 界面:

  • 上半窗口:源码浏览窗口
  • 下半窗口:gdb 命令输入框,所有 gdb 命令直接通用。

2‑3 gdb 常见使用命令

命令简写功能说明
file ./test_debuggdb 内加载可执行文件
b 行号b设置断点:b 12在第 12 行打断点
b 函数名b在函数入口打断点:b calc
runr启动程序运行,运行到断点停下
nextn单步跳过:执行下一行,不会进入函数内部
steps单步进入:执行下一行,遇到函数调用跳进函数内部
continuec继续运行程序,直到下一个断点或者程序结束
finishfin执行完当前函数,跳出回到调用处
print 变量p打印变量的值:p sum
ptype 变量查看变量类型
listl查看源码,l 5查看第 5 行附近源码
btbt打印调用栈,查看函数调用链路,排查崩溃非常关键
info breakpointsi b查看所有断点
delete 断点编号d删除断点:d 1删除 1 号断点
quitq退出 gdb 调试器

简单调试流程示例:

b main #在main函数打断点 r #运行程序,停在main n #一行一行往下跑 p sum #查看sum变量 s #进入calc函数 bt #查看调用栈 q #退出

2‑4 常见技巧‑加餐

1. core 文件调试,定位程序崩溃 (段错误 segfault)

程序发生段错误崩溃,可以生成 core 转储文件,保存崩溃瞬间内存现场。

  1. 打开 core 文件生成开关
ulimit -c unlimited
  1. 运行程序崩溃,当前目录生成core.xxxx文件
  2. gdb 加载程序 + core 文件,直接定位崩溃位置
gdb ./test_debug core.12345 bt

bt命令立刻看到崩溃发生在哪一行,不需要复现 bug。


2. 条件断点

只有满足条件才触发断点,循环调试神器。

# 在第10行,i等于5的时候才停下 b 10 if i==5

3. 观察点 watch:变量改变自动断下

监控某个变量,一旦变量的值发生修改,程序自动停下。

watch sum

4. 调试时动态修改变量

不用修改源码、不用重新编译,调试会话直接修改内存变量。

set var sum = 100 p sum

5. attach 附加调试正在运行的进程

针对已经在后台运行的程序,不需要重启,直接挂载调试。

#先拿到进程PID ps aux | grep ./test_debug
gdb attach 12000 #传入进程PID

调试结束:detach脱离进程,程序继续正常运行。


6. display 自动打印变量

每次停下自动打印变量,不用反复敲 print。

display sum info display undisplay 1

http://www.jsqmd.com/news/1371192/

相关文章:

  • 闲鱼API
  • Cocos Creator消除游戏开发实战:数据结构、算法与性能优化
  • 聚合收款 - GrowthUME
  • 保温胶水哪个服务好? - 中媒介
  • Maven构建中资源文件丢失的排查与解决指南
  • XNB文件处理终极指南:轻松解包打包Stardew Valley游戏资源
  • 绵阳卫生间壁龛设计的施工条件与步骤
  • 河间汽车配件批发哪家质量好? - 中媒介
  • JMeter接口自动化测试:CSV数据驱动与批量执行实战指南
  • 互动教学App开发的好处和相关功能介绍
  • 加宽减震轮儿童平衡车制造商 - 中媒介
  • 好消息--------目前网站已经有少数人开始访问了
  • 零基础学SQL 03:ORDER BY / GROUP BY / HAVING——查询收尾三件套,别再写错顺序
  • 实拍图片一键找货源!详解 1688 图搜 API 六大落地应用场景
  • Unity关卡编辑器开发避坑指南:数据、撤销与协作架构实战
  • 室内水培设备推荐哪家 - 中媒介
  • 内存地址与空间:从底层原理到实战调优的深度解析
  • 传统工艺零食哪家好? - 中媒介
  • 【单片机课程设计/毕业设计】单片机驱动的农田湿度光照阈值声光报警控制系统设计 基于 STM32/51 单片机继电器控制水泵补光灯智能硬件开发(020602)
  • JetBrains IDE试用重置终极指南:简单三步无限延长开发工具使用时间
  • AI Agent:不是只会聊天的百科,而是能动手办事的AI助手,程序员必学的核心能力!
  • Unity ShaderGraph沙盒环境搭建:高效可视化着色器开发指南
  • SpringBoot格式化器原理与实战应用
  • Community Over Code Asia 2026 在北京圆满落幕!
  • 护眼仪蓝牙连接哪家好? - 中媒介
  • 高校实验室智能管理系统:Java+SSM与Flask混合架构实践
  • 单片机毕设选题推荐:基于继电器控制的酒驾车辆动力切断单片机系统设计 基于 MQ-3 传感器的多模式声光语音酒精报警硬件系统开发(020502)
  • 断桥铝系统窗哪家效果好? - 中媒介
  • C#开发者必备:dotnet命令行工具全指南
  • Spring AI Graph实战:构建集成RAG与Supervisor路由的智能体工作流