Liunx基础开发工具(四)git与gdb/cgdb篇
本文分为两大模块Git 版本控制和GDB/CGDB 调试工具是一份面向开发入门的学习笔记。Git 用来管理代码版本实现多人协作与版本回溯CGDB基于 GDB用来调试 C/C 程序通过断点、单步、观察点等手段定位程序 bug附带完整命令与可直接运行的示例代码。目录1.什么是 Git2.为什么要用 Git3.Git 安装WindowsMacLinuxUbuntu/Debian验证安装 配置用户名邮箱4.Git 基础用法1. 创建本地仓库2. 查看文件状态3. 添加文件到暂存区4. 提交暂存内容到本地仓库5. 查看提交日志6. 版本回退7. 分支操作8. 远程仓库关联与推送拉取5.简单实操示例6.补充小知识点二、gbd/cgbd1.概念2.为什么要使用 GDB/CGDB3.安装Ubuntu / Debian验证安装4.示例代码 test.c5.核心命令讲解1. b break 设置断点2. rrun 启动程序3. info b info breakpoints 查看所有断点4. d delete 删除断点5. n next 单步跳过step over6. s step 单步进入step into7. bt backtrace 查看调用栈8. finish 执行完当前函数返回调用处9. pprint 打印变量 / 表达式10. disable /enable 禁用 / 启用断点11. c continue 继续运行12. until 运行到指定行用于循环跳出13. display /undisplay 自动显示变量14. watch 观察点 变量发生变化时自动断下15. set var 运行时修改变量16. 条件断点 给已存在断点增加条件方式 1创建断点时直接带条件方式 2给已经存在的断点追加条件重点17. CGDB 分屏操作CGDB 专属快捷键6.调试演示7.补充三、总结用法git编辑gdb/cgdb1.什么是 GitGit 是一款分布式版本控制系统由 Linus Torvalds 开发用来跟踪文件变更、管理代码版本。几个核心概念工作区 (Working Directory)你肉眼看到的文件夹日常写代码的地方。暂存区 (Stage/Index)临时存放准备提交的文件变更相当于 “待提交清单”。本地仓库 (Repository).git隐藏文件夹保存所有历史版本快照。远程仓库放在云端Gitee/GitHub/GitLab的仓库多人协作共享代码。文件三种状态已修改(modified)→已暂存(staged)→已提交(committed)2.为什么要用 Git版本回溯写错代码可以随时回退到之前任意版本不怕代码改崩丢失。分支开发新建分支开发新功能不破坏主代码功能完成后合并分支。多人协作多人并行开发记录每个人修改解决代码冲突。变更记录自动记录每次修改内容、修改人、时间、备注方便追溯。异地备份本地 远程双备份防止电脑文件丢失。不用 Git 的痛点手动复制v1/v2_final/v2_final_final文件夹版本混乱、代码丢失、多人传文件覆盖。3.Git 安装Windows官网下载https://git-scm.com/download/win 安装时一路默认即可安装完成后右键菜单出现Git Bash。Mac# 方式1homebrew安装 brew install git # 方式2安装Xcode命令行工具 xcode-select --installLinuxUbuntu/Debiansudo apt update sudo apt install git验证安装 配置用户名邮箱# 查看版本 git --version # 配置全局用户名提交记录会显示 git config --global user.name 你的名字 # 配置全局邮箱和gitee/github邮箱保持一致 git config --global user.email xxxxxx.com # 查看配置 git config --global --list--global全局配置本机所有 git 仓库生效不加则只对当前仓库生效。4.Git 基础用法1. 创建本地仓库方式 1把已有文件夹初始化为 git 仓库# 进入项目文件夹 cd /d/code/demo # 初始化git仓库生成隐藏.git文件夹 git init方式 2克隆远程仓库到本地git clone https://gitee.com/xxx/demo.git2. 查看文件状态git status红色工作区修改未暂存绿色文件已经加入暂存区。3. 添加文件到暂存区# 添加单个文件 git add index.html # 添加当前目录下所有修改文件 git add .4. 提交暂存内容到本地仓库git commit -m 第一次提交创建首页文件-m后面写提交说明必须写清楚本次改动内容。5. 查看提交日志git log # 简洁单行查看日志 git log --oneline6. 版本回退# 回退到指定commit_id版本commit_id从git log复制前几位即可 git reset --hard a1b2c3d--hard工作区、暂存区全部回退到目标版本谨慎使用7. 分支操作# 查看所有分支 git branch # 创建新分支 git branch dev # 切换到dev分支 git checkout dev # 新版git推荐写法 git switch dev # 创建并直接切换到新分支 git checkout -b feature/login # 合并dev分支到master/main分支 git checkout main git merge dev开发规范main/master保存稳定上线代码新功能新建分支开发测试完成再合并。8. 远程仓库关联与推送拉取# 关联远程仓库origin是远程仓库默认别名 git remote add origin https://gitee.com/xxx/demo.git # 查看远程仓库 git remote -v # 将本地main分支推送到远程 git push origin main # 拉取远程最新代码到本地 git pull origin main5.简单实操示例# 1.新建项目文件夹初始化git mkdir git-demo cd git-demo git init # 2.新建文件 echo hello git readme.md # 3.查看状态 git status # 4.加入暂存区 git add . # 5.提交本地仓库 git commit -m 添加readme.md # 6.新建分支开发 git checkout -b feature/add-title echo ## Git笔记 readme.md git add . git commit -m readme增加标题 # 7.切回主分支合并 git checkout main git merge feature/add-title6.补充小知识点.gitignore文件配置不需要 git 管理的文件日志、缓存、环境配置# .gitignore示例内容 *.log node_modules/ .idea/冲突多人修改同一文件同一区域合并时出现冲突需要手动修改文件后再 addcommit。工作流简易流程修改文件 → git add → git commit → git push二、gbd/cgbd1.概念GDBGNU DebuggerGNU 开源命令行调试器用于调试 C/C 等编译型程序。程序编译时带上调试信息gdb 可以控制程序运行、断点暂停、查看变量、查看调用栈、观察内存变化。CGDBGDB 的文本前端底层仍然调用 GDB所有 gdb 命令在 cgdb 里面完全通用。 CGDB 界面分上下分屏上屏源代码窗口显示源码标记断点位置下屏GDB 命令输入窗口执行 gdb 指令区别原生 gdb 只有命令行看不到源码cgdb 自带源码分屏不用来回切换调试更直观。2.为什么要使用 GDB/CGDB打印日志局限性大printf调试需要改代码、重新编译gdb 不需要修改源码动态查看变量。断点控制执行可以在指定行暂停程序单步执行观察每一步变量变化。崩溃定位程序段错误 (segment fault) 崩溃时gdb 可以打印调用栈直接找到崩溃代码行。条件断点 / 观察点只有满足条件才暂停循环大量迭代时非常有用。查看栈帧bt查看函数调用链理清函数调用关系。修改运行时变量set var可以在程序运行中临时修改变量值测试不同分支逻辑不用重新编译。适用场景C/C 底层开发、算法调试、定位野指针、内存越界、死循环、程序崩溃。3.安装Ubuntu / Debian# 安装gdb cgdb sudo apt update sudo apt install gdb cgdb验证安装gdb --version cgdb --version编译 C 程序必须加-g参数加入调试符号信息否则断点、源码查看失效。gcc test.c -o test -g4.示例代码 test.c下面所有 cgdb 调试命令都基于这份代码演示#include stdio.h int add(int a, int b){ int res a b; return res; } int main(){ int i 0; int sum 0; for(i 0; i 5; i){ sum add(i, 2); } printf(sum %d\n, sum); return 0; }编译gcc test.c -o test -g # 启动cgdb调试程序 cgdb ./test进入 cgdb 后上方源码窗口esc切换到源码窗口i切回下方 gdb 命令窗口所有 gdb 命令在下方输入框执行5.核心命令讲解1. b break 设置断点# 在main函数打断点 b main # 在第10行打断点 b 10 # 在add函数打断点 b add2. rrun 启动程序r程序开始运行遇到第一个断点就暂停。3. info b info breakpoints 查看所有断点info b输出会列出断点编号、行号、是否启用、命中次数。4. d delete 删除断点# 删除断点编号1 d 1 # 不带编号删除全部断点会提示确认 d5. n next 单步跳过step over执行下一行代码不会进入函数内部n在sum add(i,2)这一行执行 n会直接执行完 add 函数停在下一行不进入 add。6. s step 单步进入step into执行下一行如果当前行是函数调用进入函数内部s在sum add(i,2)执行 s会跳进add函数。7. bt backtrace 查看调用栈程序暂停时查看函数调用链定位当前在哪一层函数。bt示例输出#0 add (a0, b2) at test.c:5 #1 0x0000555555555182 in main () at test.c:12#0 是当前函数#1 是调用者。8. finish 执行完当前函数返回调用处finish现在在 add 函数内执行 finish一次性跑完 add 函数回到 main 函数调用 add 的那一行暂停。9. pprint 打印变量 / 表达式# 打印i的值 p i # 打印sum p sum # 表达式计算 p sum 1010. disable /enable 禁用 / 启用断点断点保留只是临时关闭不用删除。# 禁用断点编号2 disable 2 # 启用断点编号2 enable 2info b里可以看到断点状态y启用n禁用。11. c continue 继续运行c继续运行程序直到下一个断点或者程序结束。12. until 运行到指定行用于循环跳出# 直接运行到第13行暂停 until 13在循环里可以快速跑到循环结束行不用一次次n。13. display /undisplay 自动显示变量每次断点暂停时自动打印变量不用反复 p。# 每次暂停自动打印i display i # 查看自动显示列表 info display # 删除自动显示编号1 undisplay 114. watch 观察点 变量发生变化时自动断下当被监控变量的值被修改程序自动暂停。watch sum只要 sum 的值被修改程序就停下适合定位变量被意外修改的 bug。15. set var 运行时修改变量程序暂停状态下直接修改内存里变量的值不用重新编译。set var i 10 p i注意语法set var 变量名值不要少写var。16. 条件断点 给已存在断点增加条件方式 1创建断点时直接带条件# 在12行设置断点只有i3的时候才断下 b 12 if i 3方式 2给已经存在的断点追加条件重点# 断点编号是1设置条件i 4 condition 1 i 4condition 断点编号 条件给已有断点附加条件。info b可以看到条件。17. CGDB 分屏操作CGDB 专属快捷键CGDB 两个窗口切换ESC切换到源码窗口上屏可以上下箭头移动源码空格快速添加断点i切换到gdb 命令窗口下屏输入 gdb 命令源码窗口按空格在当前行快速添加 / 取消断点等价 b 行号:help在 cgdb 查看帮助:q退出 cgdbCtrld也可以退出6.调试演示# 编译 gcc test.c -o test -g # 启动cgdb cgdb ./test下方 gdb 窗口依次输入# 1. 设置断点 b main # 2. 启动程序 r # 3. 到main断点查看断点列表 info b # 4. 设置观察点sum watch sum # 5. 自动显示i display i # 6. 单步执行 n n # 进入add函数 s # 查看调用栈 bt # 跑完add函数返回 finish # 给断点增加条件i3 condition 1 i3 # 继续运行 c # 修改变量i set var i 10 # 删除断点 d 1 # 继续运行到结束 c # 退出cgdb quit7.补充编译不加-g没有调试符号看不到源码、断点、变量调试基本失效。条件断点适合循环避免上千次手动单步。watch 是写观察点还有rwatch读awatch读写。CGDB 只是前端所有调试逻辑仍然是 GDB。三、总结用法gitgdb/cgdb断点与运行控制表格命令作用示例b 函数/行号设置断点b main、b 10r运行程序至断点rinfo b查看所有断点info bd 编号删除断点不带编号删全部d 1enable/disable 编号启用 / 禁用断点disable 2c继续运行c单步与栈表格命令作用示例n单步跳过不进函数ns单步进入进函数sbt查看调用栈btfinish执行完当前函数返回finishuntil 行号运行到指定行until 13变量与监控表格命令作用示例p 变量打印变量 / 表达式p i、p sum10display/undisplay每次暂停自动显示变量display iwatch 变量变量被修改时断下watch sumset var 变量值运行时修改变量set var i 10条件断点表格命令作用示例b 行号 if 条件新建断点带条件b 12 if i 3condition 编号 条件给已有断点加条件condition 1 i 4CGDB 分屏快捷键表格按键作用ESC切换到源码窗口上屏i切换到命令窗口下屏空格源码窗口快速增删断点:q/Ctrld退出 cgdb