前言:在Linux開發流程中,版本控制與程序調試是保障項目穩定性和開發效率的兩大核心環節。Git作為當前最主流的分布式版本控制系統,能高效管理代碼迭代、追蹤修改記錄并支持多人協同開發;GDB(GNU調試器)是Linux下調試C/C++程序的利器,可幫助開發者定位代碼邏輯錯誤、跟蹤變量變化,快速排查運行時問題。本文將從實戰角度出發,詳細拆解GIt的核心操作與GBDB的調試技巧。
一、Git:從基礎到實踐的版本控制
1.1為什么需要版本控制?
- 版本控制的價值:記錄代碼每一次修改(誰改、改了什么、什么時候改),支持一鍵回滾到歷史版本,實現多人并行開發時的代碼同步與沖突解決
- 對比傳統“復制副本”方式:告別 “項目 - v1.doc”“項目 - 最終版 2.doc” 的混亂命名,用 Git 統一管理版本,減少冗余文件
1.2 Git簡史:從Linux內核開發需求誕生的工具
- 背景:2005年,Linux內核開發團隊因商業版本控制系統BitKeeper終止授權,由Linus Torvalds主導開發Git
- 核心設計目標:
- 速度快:高效處理超大規模項目(如Linux內核,百萬級代碼量)
- 完全分布式:無需依賴中央服務器,本地可完成版本管理,聯網后同步即可
- 支持非線性開發:輕松創建、合并分支,滿足多人并行開發需求
1.3Git環境搭建:Linux下的安裝和初始化配置
(1)在Linux安裝Git(以Centos/Ubuntu為例)
- Centos系統:
//1.先下載gitsudo yum install git//2.再查看git版本,確認是否下載下來了git --version
- Ubuntu系統:
sudo apt install git -ygit --version
(2)在github/gitee創建項目(下面以gitee為例)
-
注冊賬號:按照網站提示寫即可
-
創建倉庫:
-
登錄成功后,進入個人主頁,在右上方?按鈕,點擊新建倉庫
-
跳轉到新頁面輸入項目名稱及其他設置:
-
創建完后,在創建好的倉庫頁面中復制倉庫鏈接,以備接下來進行下載:
-
(3)將倉庫克隆到Linux下
- 創建一個放置代碼的目錄(
往后的要提交到遠程倉庫的代碼最好放在這個目錄下
)
git clone [url]//url就是上一步復制的倉庫鏈接
- Git“三板斧”–提交代碼到遠程倉庫:
操作步驟 | 命令 | 作用 | 示例 |
---|---|---|---|
1.暫存代碼 | git add 文件名 | 將修改的文件加入 “暫存區”,標記為待提交狀態 | 暫存單個文件:git add main.c ;暫存所有修改:git add . |
2.本地提交 | git commit -m "提交說明" (提交說明一定要有,即使不寫,也要寫上雙引號) | 將暫存區的修改提交到 “本地倉庫”,并添加說明(必須寫清楚修改內容) | git commit -m “修復main函數中的邏輯錯誤,添加參數校驗” |
3.遠程同步 | git push | 將本地倉庫的提交同步到遠程 Gitee 倉庫 | 執行后輸入 Gitee用戶名和密碼 |
(4)首次使用配置:設置用戶信息(關鍵!!!)
Git需要知道提交者的姓名和郵箱,用于標記每一次代碼的歸屬,配置命令如下:
# 全局配置(對當前用戶所有Git倉庫生效)
git config --global user.name "你的姓名" # 如"Zhang San"
git config --global user.email "你的郵箱" # 如"zhangsan@example.com" # 查看配置是否生效
git config --list # 輸出中應包含user.name和user.email的配置
(5)常用輔助命令:查看狀態與歷史
- 查看當前代碼修改狀態:
git status
(顯示哪些文件被修改、哪些被暫存) - 查看提交歷史:
git log
(顯示所有提交記錄) - 拉取遠程倉庫最新代碼:
git pull
(建議先拉取再提交,避免沖突)
1.4 進階技巧:.gitignore忽略文件與免密提交
(1).gitignore:忽略無需版本控制的文件
有些文件(如編譯生成的.o
文件、可執行文件、日志文件)無需納入 Git 管理,可通過創建.gitignore
文件指定忽略規則:
1. 在倉庫根目錄創建.gitignore
:
vim .gitignore
2.寫入忽略規則(示例):
# 忽略所有.o文件 *.o # 忽略可執行文件(如main) main # 忽略日志目錄 log/
3.提交.gitignore
到倉庫(同代碼提交步驟)
git add .gitignore git commit -m "添加.gitignore,忽略編譯產物和日志" git push
(2)配置免密提交:避免每次push輸入賬號密碼
方法一:SSH密鑰
- 步驟一:檢查本地是否已存在SSH密鑰,執行命令:
ls -la ~/.ssh/
若輸入中包括id_rsa
(私鑰)和id_rsa.pub
(公鑰),即已存在密鑰,直接跳到步驟三;若無,繼續第二步
- 步驟二:執行以下命令生成RSA類型的SSH密鑰,過程中無需輸入復雜密碼(按3次回車鍵即可)
ssh-keygen -t rsa -C "你的 Gitee 綁定郵箱" # 替換為你注冊 Gitee 時用的郵箱
輸出示例:
- 步驟三:查看并復制SSH公鑰,執行以下命令
cat ~/.ssh_rsa.pub/
如下,復制密鑰即可:
- 步驟四:在gitee上配置 SSH公鑰
-
登錄Gitee賬號,點擊右上角設置
-
在左側菜單找到安全->SSH公鑰,點擊添加公鑰,如下
-
點擊確定,并驗證賬號密碼,完成公鑰配置。
-
- 步驟五:驗證SSH連接并修改倉庫遠程地址
- 執行如下命令:
ssh -T git@gitee.com
- 查看當前遠程地址(確認是否是HTTPS格式)
git remote -v
若輸出含https://gitee.com/...
,不包括你的用戶名和倉庫名,需要進行下一步修改;
- 修改遠程地址為SSH格式:
git remote set-url origin git@gitee.com:你的用戶名/你的倉庫名.git
- 驗證修改結果:
git remote -v
輸出如下效果即成功:
- 步驟六:測試免密碼提交
執行git push
提交代碼,此時無需輸入賬號密碼,直接完成同步(首次使用SSH可能需要確認密鑰,后續永久免密)
方法二:系統配置
- 步驟一:在根目錄創建文件
.git-credentials
,并進入文件,輸入內容plaintext https://{username}:{password}@github.com
cd ~
touch .git-credentials
vim .git-credentials
https://{username}:{password}@github.com //username即用戶名,password即用戶密碼
- 步驟二:在終端輸入以下命令
git config --global credential.helper store
- 步驟三:打開
~/.gitconfig
文件,會發現多了一項
[credential]
helper = store
- 步驟四:測試免密提交,執行
git push
提交代碼,此時無需輸入賬號密碼,直接完成同步(與法一效果相同)
二、GDB:Linux下的C/C++程序調試利器
2.1調試前準備:編譯時添加-g
選項(生成調試信息)
- 程序的發布方式有兩種,
debug
模式和release
模式,Linux下用gcc/g++
編譯程序時,默認是release
模式(無調試信息,無法用GDB調試),需添加-g
選項開啟debug
模式:
//編譯test1.c,生成帶調試信息的可執行文件test1
gcc test1.c -o test1 -g//查看調試信息
gdb test1
2.2 GDB基礎操作:啟動、退出與核心調試命令
(1)啟動與退出GDB
- 啟動GDB:
gdb 可執行文件名
(如上圖),進入GDB交互頁面(提示符為gdb
) - 退出GDB:輸入
quit
或ctrl+d
(2)GDB基礎命令
命令 | 作用 | 樣例 |
---|---|---|
list(l) 行號或函數名或文件名:行號 | 顯示源代碼,從上次位置開始列出n行 或指定函數 的源代碼或指定文件 的源代碼 | list 10或mian或test1.c:2 |
run? | 從程序開始連續執行 | run? |
next(n) | 單步執行,不進入函數內部 | next(n) |
step(s) | 單步執行,且進入函數內部 | step(s) |
break(b) 文件名:(可省略)行號或函數名 | 在指定行數設置斷點或在函數開頭設置斷點 | break test1.c:10或main |
info(i) break(b)/breakpoints | 查看當前所有斷點信息/斷點列表 | info b/breakpoints |
info(i) locals | 查看當前棧的局部信息(查看臨時變量) | info locals |
finish | 執行到當前函數返回,然后停止 | finish |
print§ 表達式/變量 | 打印表達式的值/指定給變量的值 | print a+b/x |
set var 變量=值 | 修改變量的值 | set var i=10 |
delete(d) breakpoints -/序號n(可省略) | 刪除所有斷點/刪除序號為n的斷點 | d breakpoints 1 |
disable/enable breakpoints | 禁用/啟用所有斷點 | disable/enable breakpoints |
display 變量名 | 跟蹤顯示指定變量的值(每次停止) | display x |
undisplay 編號 | 取消對指定編號變量的跟蹤 | undisplay x |
backtrace(bt) | 查看當前執行棧的各級函數條用及參數 | bt |
quit(q) | 退出GDB調試器 | q |
2.3 GDB進階技巧:監視變量、條件斷點與棧幀查看
示例代碼sum.c
:
#include <stdio.h>// 求和函數:計算s到e的累加和
int Sum(int s, int e) {int result = 0;for (int i = s; i <= e; i++) {result += i;}return result;
}int main() {int start = 1;int end = 100;int total = Sum(start, end);printf("1到100的和:%d\n", total);return 0;
}
(1)watch
:監視變量的變化(變量修改時自動斷點)
示例:
(2)條件斷點:滿足特定條件才觸發斷點
當循環次數較多(如100次),只想在某一次循環(如i=50)時斷點,用條件斷點:
- 方式一:新增斷點時直接加條件:
b 行號 if 條件
(gdb) b 6 if i == 50 # 在第6行(result += i)設斷點,僅當i=50時觸發
Breakpoint 3 at 0x40052a: file sum.c, line 6.
- 方式二:給已有斷點追加條件:
condition 斷點編號 條件
(gdb) b 6 # 先設普通斷點(編號假設為3)
(gdb) condition 3 i == 50 # 給3號斷點加條件
(gdb) info b # 查看斷點,會顯示“stop only if i == 50”
(3)棧幀查看:bt 與info locals 定位函數調用鏈
當程序崩潰或執行到深層函數時,用bt
(backtrace)查看函數調用棧,用info locals
查看當前函數的局部變量:
2.4 優化調試體驗:安裝cgdb(代碼分屏的GDB)
默認 GDB 為純命令行界面,無法同時顯示代碼和調試命令,cgdb
是 GDB 的增強工具,支持 “代碼分屏”:
- 安裝:(centos/Ubuntu)
#Centos
sudo yum install cgdb -y#Ubuntu
sudo apt install cgdb -y
- 使用:
cgdb 可執行文件名
(如cgdb sum
),界面分為上下兩部分:上半部分顯示源代碼,下半部分顯示GDB命令行 - 快捷鍵:按
ESC
切換到代碼區(可用方向鍵滾動代碼),按i
切換回命令行
效果如下: