【Linux】Linux開發:GDB調試器與Git版本控制工具指南

在這里插入圖片描述

Linux相關知識點可以通過點擊以下鏈接進行學習一起加油!
初識指令指令進階權限管理yum包管理與vim編輯器GCC/G++編譯器
make與Makefile自動化構建

在 Linux 開發中,GDB 調試器和 Git 版本控制工具是開發者必備的利器。GDB 幫助快速定位代碼問題,Git 則提供高效的版本管理與協作支持。本指南將簡明介紹兩者的核心功能與使用技巧,助力提升開發效率。

請添加圖片描述
Alt
🌈個人主頁:是店小二呀
🌈C語言專欄:C語言
🌈C++專欄: C++
🌈初階數據結構專欄: 初階數據結構
🌈高階數據結構專欄: 高階數據結構
🌈Linux專欄: Linux

🌈喜歡的詩句:無人扶我青云志 我自踏雪至山巔 請添加圖片描述

文章目錄

  • 一、Git版本控制器
    • 1.1 Git與GitHub關系
    • 1.2 安裝git
  • 二、GitHub創建項目
    • 2.1 新建倉庫
    • 2.2 將遠端倉庫拉起到本地
    • 2.3 一、二板斧:add+commit
      • 2.3.1 設置git上傳
      • 2.3.2 git add與git commit在做什么?(重點)
    • 2.4 三板斧:push
    • 2.5 git其他選項
      • 2.5.1 git log可以查看提交記錄
      • 2.5.2 git status可以查看當前目錄狀態
  • 三、git流程解析
  • 四、Linux調試器-gbd
    • 4.1 、可執行程序生成調試信息
    • 4.3 readELF指令查看調試信息
  • 五、gdb相關調式指令
    • 5.1 list調式指令
    • 5.2 run調試指令
    • 5.3 斷點相關調試指令
      • 5.3.1 breakpoint調試指令
      • 5.3.2 info breakdpoints調試指令
      • 5.3.3 delete調試指令
      • 5.3.4 disable調試指令
      • 5.3.5 enable調試指令
    • 5.4 next調試指令
    • 5.5 step調式指令
    • 5.6 printf 調式指令
    • 5.7 display調試指令
    • 5.8 undisplay調式指令
  • 六、快速排查問題
    • 6.1 continue 調式指令
    • 6.2 finish 調式指令
      • 6.2.1 next和finish區別
    • 6.3 until調式指令
    • 6.4 set var調式指令

一、Git版本控制器

1.1 Git與GitHub關系

  • Git】:Git是版本控制系統,專門用于管理和跟蹤代碼的修改歷史。**它能夠在本地完整保存項目的所有版本,方便開發者在自己的電腦上管理項目,記錄每次更改。
  • 【GitHub】:GitHub是基于Git的遠程平臺,GitHub是一個托管代碼的在線平臺,它建立在Git之上,為Git倉庫提供了一個云端存儲庫。

Git主要是一個在本地管理文件版本的工具,用于跟蹤文件的每次修改,實現代碼的歷史管理。而為了滿足大規模協作的需求,GitHub應運而生,它在云端提供了一個基于Git的倉庫平臺,讓開發者可以遠程存儲、共享代碼,并實現多人協作和代碼同步。Git負責本地的版本控制,而GitHub是對Git功能的拓展,實現了在云端共享和管理代碼的能力。

1.2 安裝git

Linux下安裝git: sudo yum install -y git

二、GitHub創建項目

2.1 新建倉庫

對于Git是一個工具,而是gitee和github是為了Git搭建的網址。

在這里插入圖片描述

在這里,選擇你需要的代碼語言來保存版本。README文件用于倉庫的說明,創建時會自動生成中英文版本。在分支選項中,這里推薦選擇單分支是為了簡化項目管理,特別是在項目初期或只是用于代碼托管時,不需要復雜的分支結構。單分支模式更適合簡單的版本控制,避免了多分支帶來的合并沖突和管理開銷。

2.2 將遠端倉庫拉起到本地

在這里插入圖片描述

1.首先在普通用戶家目錄下,下載代碼請復制以下命令到終端執行。

指令:git clone 地址

在這里插入圖片描述

2.克隆到普通用戶家目錄下,我們通過ls -la指令進行查看。

在這里插入圖片描述

3.當我們將遠端倉庫拉取到本地,為了確保提交的代碼身份被Gitee/GitHub正確識別,需要在本地進行相關配置

在這里插入圖片描述

在這里插入圖片描述

  1. 將本地倉庫里的文件拷貝遠端倉庫為了方便測試代碼,統一放到一個testgit文件中,然后進入遠端倉庫目錄進行拷貝。

命令:cp …/testgit . -rf

在這里插入圖片描述

2.3 一、二板斧:add+commit

相關指令命令

  • git add . 】:將當前位置的所有文件都添加到本地倉庫上
  • git commit -m"內容"】 (內容可以是日志或記錄,不能隨便填寫,必須填寫):該步驟是把內容提交到本地倉庫中,跟遠端倉庫沒有關系的

在這里插入圖片描述

2.3.1 設置git上傳

如果是首次使用,需要配置郵箱和用戶名。是為了確保可以找到這份代碼的源頭。

設置命令

  • git config -global user.email-“你的郵箱”
  • git config -global user.name-“你的名字”

在這里插入圖片描述

2.3.2 git add與git commit在做什么?(重點)

git addgit commit 只能在 Git 倉庫的目錄及其子目錄中操作,不能直接將其他路徑的文件添加到該倉庫的版本控制中。

Git 的工作流程分成了幾個不同的區域:工作區、暫存區和本地倉庫。簡單來說,Git 并不會自動保存工作區中的修改,而是需要顯式地通過 git addgit commit 命令將更改記錄到本地倉庫。

  • 工作區(Working Directory):這是你在項目目錄中看到的文件。當你對文件進行修改時,這些更改只存在于工作區,還沒有被 Git 跟蹤為新版本。
  • 暫存區(Staging Area):當你運行 git add 命令時,Git 會將選定的更改(比如修改、添加或刪除的文件)添加到暫存區。暫存區是一個“待提交”的清單,是 Git 知道你想提交的內容,但還沒有正式保存的地方
  • 本地倉庫(Local Repository):當你運行 git commit 命令時,Git 會將暫存區的內容提交到本地倉庫中,這就創建了一個新的“版本”記錄。這些提交在本地倉庫中保存下來,可以隨時查閱或還原。

2.4 三板斧:push

命令: git push

在這里插入圖片描述

這里需要輸入你在平臺上的賬號名和密碼,完成本地倉庫跟遠端倉庫進行同步

2.5 git其他選項

2.5.1 git log可以查看提交記錄

在這里插入圖片描述

2.5.2 git status可以查看當前目錄狀態

在這里插入圖片描述

這里我只是add+commit,并沒有同步到遠端。系統就會提示當前我已經托管到本地倉庫,但是還沒有同步到遠端。然后push同步就不需要做任何操作拉。

三、git流程解析

1..git 目錄是 Git 本地倉庫,通過 add 命令可以將修改的內容提交到一個暫存區,方便后續的版本控制和管理。

在這里插入圖片描述

2.commit 會將暫存區中的內容提交到本地倉庫,并清空暫存區。最后,push 會將本地倉庫的更改同步到遠程倉庫。

在這里插入圖片描述

3..gitgnore文件

在這里插入圖片描述

  1. 它實際上是一個配置文件,用于指定哪些文件或文件類型不應被添加到版本控制中。
  2. 不要忘記使用*符號,它是一個通配符,用于匹配任意數量的字符。
  3. 我們可以自行編輯該文件,將不想納入版本控制的文件后綴或路徑寫入其中。

四、Linux調試器-gbd

知識鋪墊

  • 程序的發布方式有兩種,debug模式和release模式
  • Linux gcc/g++出來的二進制程序,默認是release模式
  • 要使用gdb調試,*必須在源代碼生成二進制程序的時候,加上 -g 選項

4.1 、可執行程序生成調試信息

gdb系統是默認安裝,直接輸入 gdb 即可啟動調試器。

在Linux下調試,只能使用gdb進行調試。-g選項用于在編譯時生成調試信息,對此啟用 -g 選項后文件體積會增大,但不會影響程序的執行速度

在這里插入圖片描述

4.3 readELF指令查看調試信息

通過 readelf 工具可以查看使用 -g 選項生成的可執行文件中的調試信息。readelf 是一個用于讀取 ELF 格式文件的命令行工具,可以幫助我們檢查 ELF 文件的頭信息、段和節的內容,其中也包括調試信息。

在這里插入圖片描述

在 Linux 系統中,雖然可執行文件是二進制格式,但其內部結構采用了 ELF (Executable and Linkable Format/可執行與可鏈接格式)格式,可以通過 readELF 工具查看。

五、gdb相關調式指令

調式指令可以全稱和簡寫,得到效果是一致的,這里通常采用簡寫。 q(退出quit)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1 list調式指令

l/list】:查找源文件內容

兩種使用方式

  • list/l 行號】:顯示binFile源代碼,接著上次的位置往下列,每次列10行
  • list/l 函數名】:列出某個函數的源代碼
  • 注意事項】:如果list/ l 后面直接跟對應的文件名是無法進行查看的,在gdb當中默認可以在該文件直接查看。

如果想要從頭開始進行查找,可以簡寫l 0從0開始進行查找

雖然上list/ l 后面直接跟對應的文件名是無法進行查看的,但是我們可以文件名基礎之上,帶上行號或函數可以進行查找啦。

**gdb會默認記錄你最近執行的一條命令的,這里默認打印十行,這里可以直接回車回車,就看見全部源文件。**如果查找到結尾,會有系統提示,比如:我們對應的整個文件一共有24行。

在這里插入圖片描述

查找時,是否應該以被查找的行號或函數作為起點?

如果輸入想查看的行號和函數,會顯示上下文。因為我們一般在看一份代碼的上下號,指定的行就是我們默認調試就是想看他的上下文。

5.2 run調試指令

r/run】:運行程序

在調試之前都需要將程序運行起來,r回車

在這里插入圖片描述

**r 指令類似于按下 F5,會直接編譯并運行程序直到結束。**但在這種模式下無法進行調試,因此我們可以先設置一個斷點,以便在指定位置暫停執行。

5.3 斷點相關調試指令

5.3.1 breakpoint調試指令

b/breakpoint】:設置斷點

打斷點方式

  • break(b) 行號 :】:在某一行設置斷點
  • break 函數名 :】:在某個函數開頭設置斷點
  • 其中 : 用于指定文件和函數
  • 斷點不能連續打,編號被使用不會重現。斷點編號本質是一個線性增長的計數器

使用場景】:b myproess.c :main

在這里插入圖片描述

圖片效果解釋

  • 函數本質上就是一個代碼塊。設置斷點時,不是設置在某一行代碼上,而是設置在函數的入口地址。例如,不是第 15 行,而是第 17 行(函數的起始位置)

5.3.2 info breakdpoints調試指令

i b/info breakdpoints】:查看當前設置了哪些斷點

通過info b調試指令可以查看當前設置斷點,其中設置斷點都是具有線性增加的Num編號。

在這里插入圖片描述

5.3.3 delete調試指令

d/delete Num(編號)】:刪除指定編號斷點

這里刪除斷點,不能通過指定文件名、行號、函數名等形式刪除,而是通過Num編號

在這里插入圖片描述

在這里插入圖片描述

在調試過程中,斷點編號是線性增長的計數器,因此斷點的編號會逐漸增加而不會重復使用。由于編號不會重置,所以斷點不能連續設置(即使之前的斷點已刪除或禁用,其編號也不會再重新分配)。這種設計保證了每個斷點在整個調試過程中都有一個唯一編號。

5.3.4 disable調試指令

disable Num(編號)】:禁用斷點,關閉Enb使能

在這里插入圖片描述

在這里插入圖片描述

5.3.5 enable調試指令

enable Num(編號)】:啟用斷點,開啟Enb使能

5.4 next調試指令

gbd會默認記錄最近一次的指令,可以回車執行最近一次指令。

n/next】:"逐過程"調試,類似于我們F10

在這里插入圖片描述

5.5 step調式指令

s/step】:"逐過程逐語句"調試,可進入到函數內部,類似于我們F11

5.6 printf 調式指令

p/printf 變量】:打印變量值

在調試器中,$ 通常用于表示查詢結果的編號。查看變量的內容或地址時,不能直接使用 p 變量名,而應通過 p $變量名 來引用已查詢過的結果。

5.7 display調試指令

如果希望變量的數值始終顯示,并在每次調試時自動刷新,可以使用 display 變量名 命令。

display】:常顯示變量的數值,具有相關編號

在這里插入圖片描述

在這里插入圖片描述

5.8 undisplay調式指令

要取消變量的自動顯示,不能直接使用 undisplay aundisplay &a,而是需要使用 undisplay 編號 命令。

undisplay 編號】:取消變量的自動顯示

在這里插入圖片描述

六、快速排查問題

問題】:無論是使用 VS 調試器還是 gdb 調用調試,核心目標是什么?

并不是單純地通過調試就能解決所有問題,而是找到代碼中的具體問題,并針對性地分析和修復。歸根結底,調試的核心在于發現問題

通過設置斷點,可以將程序執行劃分為不同的范圍。如果某個范圍內發生崩潰,就可以對這一范圍進行局部調試。斷點的作用就是幫助我們快速縮小問題范圍,尤其在面對冗長的代碼時,斷點能顯著提高排查效率。

6.1 continue 調式指令

c/continue】:斷點處跳躍

在這里插入圖片描述

6.2 finish 調式指令

【finish】指令:直接運行完當前所在的函數并停下。使用 finish 時,調試器不會逐步執行函數內部的代碼,而是快速跳出函數,直接返回調用點。這在函數內部細節不重要、或者希望快速查看函數返回結果時非常實用。

在這里插入圖片描述

6.2.1 next和finish區別

因此,nfinish 的關鍵區別在于 finish 能讓你在函數返回后停留并顯示返回值,而 n 只是跳過整個函數調用,并不提供返回值的詳細信息。

6.3 until調式指令

【until】指令:將程序運行到指定的行號并暫停,期間的代碼會被正常執行。這非常適合快速跳過某段代碼,直接查看指定位置的運行狀態

在這里插入圖片描述

6.4 set var調式指令

set var 變量名 = 新值,這個指令非常適合調試復雜邏輯時臨時調整變量值!

【set var】:用于在調試過程中直接修改變量的值,從而影響程序的運行狀態

在這里插入圖片描述


在這里插入圖片描述

以上就是本篇文章的所有內容,在此感謝大家的觀看!這里是Linux筆記,希望對你在學習Linux旅途中有所幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65331.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65331.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65331.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【設計模式-2】23 種設計模式的分類和功能

在軟件工程領域,設計模式是解決常見設計問題的經典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人幫,GoF)在《設計模式:可復用面向對象軟件的基礎》一書中系統性地總結了…

谷粒商城-高級篇完結-Sleuth+Zipkin 服務鏈路追蹤

1、基本概念和整合 1.1、為什么用 微服務架構是一個分布式架構,它按業務劃分服務單元,一個分布式系統往往有很多個服務單元。由于服務單元數量眾多,業務的復雜性,如果出現了錯誤和異常,很難去定位 。主要體現在&#…

小米智能啞鈴上市,代理 IP 視角下的智能健身新篇

在智能科技與健康生活深度融合的時代,小米以其敏銳的市場洞察力和強大的創新能力,不斷拓展智能生態版圖。米家智能啞鈴的發布,無疑是其在智能健身領域的又一重要舉措。而當我們從代理 IP 的獨特視角來審視這一產品,會發現其中蘊含…

基于Python的音樂播放器 畢業設計-附源碼73733

摘 要 本項目基于Python開發了一款簡單而功能強大的音樂播放器。通過該音樂播放器,用戶可以輕松管理自己的音樂庫,播放喜愛的音樂,并享受音樂帶來的愉悅體驗。 首先,我們使用Python語言結合相關庫開發了這款音樂播放器。利用Tkin…

實際開發中,常見pdf|word|excel等文件的預覽和下載

實際開發中,常見pdf|word|excel等文件的預覽和下載 背景相關類型數據之間的轉換1、File轉Blob2、File轉ArrayBuffer3、Blob轉ArrayBuffer4、Blob轉File5、ArrayBuffer轉Blob6、ArrayBuffer轉File 根據Blob/File類型生成可預覽的Base64地址基于Blob類型的各種文件的下載各種類型…

微信小程序中的 storage(本地存儲)和內存是兩個完全不同的存儲區域

這是一個非常關鍵且容易混淆的概念 既然 this.globalData.appId appId 是將 appId 存儲在內存中,為什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存儲)中沒有 appId,并且您提出了一個非常重要的疑問:stor…

【C++數據結構——查找】二叉排序樹(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 相關知識 1. 二叉排序樹的基本概念 2. 二叉排序樹節點結構體定義 3. 創建二叉排序樹 4. 判斷是否為二叉排序樹 5. 遞歸查找關鍵字為 6 的結點并輸出查找路徑 6. 刪除二叉排序樹中的節點 測試說明 通關代碼 測試結果 任務描述 本關任務&a…

計算機網絡(第8版)第3章課后習題--透明傳輸

【3-11】 試分別討論以下各種情況在什么條件下是透明傳輸,在什么條件下不是透明傳 輸。(提示:請弄清什么是“透明傳輸”,然后考慮能否滿足其條件。) (1)普通的電話通信。 (2)互聯網提供的電子郵件服務。 解 答 : 透明傳輸是指在數據傳輸…

Linux(17)——使用 DNF 安裝和更新軟件包

目錄 一、使用 DNF 管理軟件包: 1、 DNF 查找軟件: 2、DNF 安裝軟件: 3、DNF 刪除軟件: 二、使用 DNF 管理軟件包組: 1、DNF 顯示組信息: 2、DNF 安裝組: 三、使用 DNF 查看事務歷史記錄…

基于32單片機的智能語音家居

一、主要功能介紹 以STM32F103C8T6單片機為控制核心,設計一款智能遠程家電控制系統,該系統能實現如下功能: 1、可通過語音命令控制照明燈、空調、加熱器、窗戶及窗簾的開關; 2、可通過手機顯示和控制照明燈、空調、窗戶及窗簾的開…

Qt 5.14.2 學習記錄 —— ? 新項目

文章目錄 1、創建2、查看代碼 ---- main.cpp3、查看代碼 ---- widgt.h4、查看代碼 ---- widgt.cpp和widget.ui5、查看代碼 ---- Empty.pro6、運行產生的中間文件 1、創建 左上角的文件,新建文件或項目。如果要寫一個GUI程序,應當選擇Application&#x…

linux wsl配置 redis遠程連接

? 1. 修改 Redis 配置文件 在 WSL 的 Redis 配置文件中,找到 redis.conf 或 /etc/redis/redis.conf 文件,編輯以下配置項: ?? 更新 bind 配置項 將 bind 127.0.0.1 ::1 修改為: bind 0.0.0.0這樣,Redis 將監聽所…

Transformer從零詳細解讀——DASOU講AI

1. 從全局角度概括Transformer transformer的任務是什么? 進一步細化 進一步細化,注意:每個encoder結構相同,參數不同;decoder同理 原論文中的圖如下: 2.Encoder 2.1 輸入部分 (1&#xff09…

ARM發布Armv9.5架構:邁向更強性能與靈活性的新時代

2024年11月30日,ARM正式發布了其最新的Armv9.5架構,這是Arm技術發展的又一重要里程碑。從表中信息來看,Armv9.5架構的發布標志著該公司的架構系列在性能、靈活性和可擴展性方面取得了進一步突破。本次發布不僅是技術上的提升,更是…

【Python運維】使用Python與Docker進行高效的容器化應用管理

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著容器化技術的廣泛應用,Docker已成為現代軟件開發與運維中不可或缺的工具。Docker容器提供了一種輕量級、可移植的方式來部署和管理應用…

分布式系統架構6:鏈路追蹤

這是小卷對分布式系統架構學習的第6篇文章,關于鏈路追蹤,之前寫過traceId的相關內容:https://juejin.cn/post/7135611432808218661,不過之前寫的太淺了,且不成系統,只是簡單的理解,今天來捋一下…

Ubuntu 20.04安裝gcc

一、安裝GCC 1.更新包列表 user596785154:~$ sudo apt update2.安裝gcc user596785154:~$ sudo apt install gcc3.驗證安裝 user596785154:~$ gcc --version二 編譯C文件 1.新建workspace文件夾 user596785154:~$ mkdir workspace2.進入workspace文件夾 user596785154:~…

問題:Flask應用中的用戶會話(Session)管理失效

我來分享一個常見的PythonWeb開發問題: 問題:Flask應用中的用戶會話(Session)管理失效 這是一個在Flask開發中經常遇到的問題。當用戶登錄后,有時會話會意外失效,導致用戶需要重復登錄。 解決方案: 1. 首先&#x…

ansible-性能優化

一. 簡述: 搞過運維自動化工具的人,肯定會發現很多運維伙伴們經常用saltstack和ansible做比較,單從執行效率上來說,ansible確實比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息隊列[暫沒深入了解]),但其實…

.net core 線程鎖,互斥鎖,自旋鎖,混合鎖

線程鎖、互斥鎖、自旋鎖和混合鎖是多線程編程中的重要概念,它們用于控制對共享資源的訪問,避免數據競爭和不一致性。每種鎖有其特定的適用場景和特點。我們來逐一解釋它們,并進行比較。 1. 線程鎖(Thread Lock) 線程…