Linux基礎開發工具三(git,gdb/cgdb)

不知道你?作或學習時,有沒有遇到這樣的情況:我們在編寫各種?檔時,為了防??檔丟失,更改 失誤,失誤后能恢復到原來的版本,不得不復制出?個副本,?如:
“報告-v1”
“報告-v2”
“報告-v3”
“報告-確定版”
“報告-最終版”
“報告-究極進化版”
...
每個版本有各?的內容,但最終會只有?份報告需要被我們使? 。
但在此之前的?作都需要這些不同版本的報告,于是每次都是復制粘貼副本,產出的?件就越來越
多,?件多不是問題,問題是:隨著版本數量的不斷增多,你還記得這些版本各?都是修改了什么
嗎?
?檔如此,我們寫的項?代碼,也是存在這個問題的!!

一、Git

1.1 版本控制器
為了能夠更?便我們管理這些不同版本的?件,便有了版本控制器。所謂的版本控制器,就是能讓你 了解到?個?件的歷史,以及它的發展過程的系統。通俗的講就是?個可以記錄?程的每?次改動和 版本迭代的?個管理系統,同時也?便多?協同作業。 ?前最主流的版本控制器就是 Git 。Git 可以控制電腦上所有格式的?件,例如 doc、excel、dwg、 dgn、rvt等等。對于我們開發?員來說,Git 最重要的就是可以幫助我們管理軟件開發項?中的源代碼 ?件!
1. 2 git來源

同?活中的許多偉?事物?樣,Git 誕?于?個極富紛爭?舉創新的年代。
Linux 內核開源項?有著為數眾多的參與者。 絕?多數的 Linux 內核維護?作都花在了提交補丁和保 存歸檔的繁瑣事務上(1991?2002年間)。 到 2002 年,整個項?組開始啟??個專有的分布式版本 控制系統 BitKeeper 來管理和維護代碼。
到了 2005 年,開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關系結束,他們收回了 Linux 內核社區免費使? BitKeeper 的權?。 這就迫使 Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds)基于使? BitKeeper 時的經驗教訓,開發出??的版本系統。 他們對新的系統制訂了若? ?標:
  • 速度
  • 簡單的設計
  • 對?線性開發模式的強??持(允許成千上萬個并?開發的分?)
  • 完全分布式
  • 有能??效管理類似 Linux 內核?樣的超?規模項?(速度和數據量)
?誕?于 2005 年以來,Git ?臻成熟完善,在?度易?的同時,仍然保留著初期設定的?標。 它的速 度?快,極其適合管理?項?,有著令?難以置信的?線性分?管理系統。

1. 3 安裝git
sudo yum install git
1. 4 git三板斧?
  1. git add .
  2. ?git commit 提交改動到本地,提交的時候應該注明提交?志, 描述改動的詳細內容.
  3. git push?同步到遠端服務器上

注冊登錄Gitee
1.創建一個倉庫
2.git clone url
3.添加代碼到本地目錄下, git add ,git commit -m "日志信息" git push?

想讓git把代碼管理起來,必須先把代碼拷貝到你當前的本地目錄下,未來托管給本地倉庫。

git add .要把當前的test.c托管到本地倉庫

git clone?Linux學習: for learning

把遠端倉庫同步到本地?

git pull 把遠端倉庫的文件拉取到本地同步。必須保證遠端倉庫和本地倉庫同步后才能進行git push

git add. 表示把當前目錄下新增的東西添加到本地倉庫里

git commit -m " "

這兩步完成了對我們的代碼做本地化提交,還要把本地化提交的信息提交到遠端,

把本地倉庫和遠端倉庫的內容進行同步git push

項目在vs當中會存在許多特定后綴的臨時文件

.gitignore:忽略后綴文件的配置文件?

git主要進行源文件頭文件,文檔等的托管

git log:?該命令的作用是查看提交歷史。

  • 對項目的開發歷史進行追溯。
  • 查找某次特定的提交記錄。
  • 查看提交者、提交時間以及提交說明等信息。

git status :?此命令用于顯示工作目錄和暫存區的狀態。

  • 確認文件的修改情況。
  • 查看哪些文件被暫存,哪些沒有。
  • 了解當前所處的分支狀態。

二、gdb/cgdb

2.1 預備知識

程序的發布?式有兩種, debug 模式和 release 模式, Linux gcc/g++ 出來的?進制程序,默認是 release 模式。

要使?gdb調試,必須在源代碼?成?進制程序的時候, 加上 -g 選項,如果沒有添加,程序?法編譯

$ gcc mycmd.c -o mycmd # 默認模式,不?持調試
$ file mycmd
mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux
3.2.0, not stripped
$ gcc mycmd.c -o mycmd -g # debug模式
$ file mycmd
mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux
3.2.0, with debug_info, not stripped

2.2 常見的指令使用?

開始: gdb binFile

退出: ctrl + d 或 quit 調試命令

命令作?樣例
list/l顯示源代碼,從上次位置開始,每次列出10?list/l 10
list/l 函數名列出指定函數的源代碼list/l main
list/l ?件名:?號列出指定?件的源代碼list/l mycmd.c:1
r/run從程序開始連續執?run
n/next單步執?,不進?函數內部next
s/step單步執?,進?函數內部step
break/b [?件名:]?號在指定?號設置斷點break 10break 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
?
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
刪除所有斷點delete breakpoints
刪除序號為n的斷點delete breakpoints 1

2. 3樣例代碼

// mycmd.c
#include <stdio.h>
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;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d-%d]=%d\n", start, end, n);return 0;
}

?

readelf -S mycmd 讀取可執行程序的格式

readelf -S mycmd | grep -i? 'debug'

那么怎么變成debug模式呢?

gcc mycmd.c -o mycmd1 -std=c99 -g。

注意:在終端下進行調試的工具cgdb

上?的基本調試還是麻煩,雖然是黑屏,但是還是想看到代碼調試
推薦安裝cgdb:
Ubuntu: sudo apt-get install -y cgdb
Centos: sudo yum install -y cgdb

??

2.4?常見技巧

2.4.1 watch

執?時監視?個表達式(如變量)的值。如果監視的表達式在程序運?期間的值發?變化,GDB 會暫停程序的執?,并通知使?者。

????

注意:

如果你有?些變量不應該修改,但是你懷疑它修改導致了問題,你可以watch它,如果變化了,就會通知你.

監視變量的變化

2.4.2??set var確定問題原因

(gdb) set var flag=1? ? ? ? # 更改flag的值,確認是否是它的原因

更改指定變量的值 -- 驗證dubug問題,解決方案是否正確

比如說更改算法中的循環次數,或者看是不是野指針(有些野指針也還會與地址)

2.4.3 條件斷點


要對邏輯進行設置條件

(gdb) b 9 if i == 30 # 9是?號,表?新增斷點的位置
Breakpoint 2 at 0x555555555186: file mycmd.c, line 9.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00005555555551c3 in main at mycmd.c:20
breakpoint already hit 1 time
2 breakpoint keep y 0x0000555555555186 in Sum at mycmd.c:9
stop only if i == 30
(gdb) finish
Run till exit from #0 Sum (s=1, e=100) at mycmd.c:7
Breakpoint 2, Sum (s=1, e=100) at mycmd.c:9
9 result += i;
1: i = 30
(gdb) finish
Run till exit from #0 Sum (s=1, e=100) at mycmd.c:9
0x00005555555551d2 in main () at mycmd.c:20
20 int n = Sum(start, end);
Value returned is $1 = 505

給已經存在的端點新增條件:已經有了breakpoint的情況下,新增修改條件。
?

(gdb) b 9   # 我們在第9?新增?個斷點,?來開始測試
Breakpoint 2 at 0x555555555186: file mycmd.c, line 9.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00005555555551c3 in main at mycmd.c:20
breakpoint already hit 1 time
2 breakpoint keep y 0x0000555555555186 in Sum at mycmd.c:9
(gdb) n
Breakpoint 2, Sum (s=1, e=100) at mycmd.c:9
9 result += i;
(gdb) n
7 for(int i = s; i <= e; i++)
(gdb) n
Breakpoint 2, Sum (s=1, e=100) at mycmd.c:9
9 result += i;
(gdb) condition 2 i==30   #給2號斷點,新增條件i==30
(gdb) info bNum Type Disp Enb Address What
1 breakpoint keep y 0x00005555555551c3 in main at mycmd.c:20
breakpoint already hit 1 time
2 breakpoint keep y 0x0000555555555186 in Sum at mycmd.c:9
stop only if i==30
breakpoint already hit 2 time

注意:

?條件斷點添加常?兩種?式:1. 新增 2. 給已有斷點追加

?注意兩者的語法有區別,不要寫錯了。

?新增: b 行號/文件名:行號/函數名 if i == 30(條件)

?給已有斷點追加:condition 2 i==30, 其中2是已有斷點編號,沒有if

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

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

相關文章

如何優化 Elasticsearch 磁盤空間和使用情況

作者&#xff1a;來自 Elastic Kofi Bartlett 解釋如何防止和處理磁盤過滿&#xff08;過度使用&#xff09;以及磁盤容量未被充分利用的情況。 想獲得 Elastic 認證&#xff1f;了解下一次 Elasticsearch Engineer 培訓的時間吧&#xff01; Elasticsearch 擁有許多新功能&am…

itop-3568開發板驅動開發指南-實驗程序的編寫

本實驗對應的網盤路徑為&#xff1a;iTOP-RK3568 開發板【底板 V1.7 版本】\03_【iTOP-RK3568開發板】指南教程\02_Linux 驅動配套資料\04_Linux 驅動例程\02。 本章實驗將編寫 Linux 下的驅動傳參實例代碼&#xff0c;通過“insmod”命令進行參數的傳遞&#xff0c;并將相應的…

lesson03-簡單回歸案例(理論+代碼)

一、梯度下降 二、 線性方程怎么樣&#xff1f; 三、有噪音嗎&#xff1f; 四、讓我們看一個列子 五、如何優化 啟發式搜索 學習進度 六、線性回歸、邏輯回歸、分類 總結、 簡單線性回歸是一種統計方法&#xff0c;用于確定兩個變量之間的關系。具體來說&#xff0c;它試圖…

【C語言】易錯題 經典題型

出錯原因&#xff1a;之前運行起來的可執行程序沒有關閉 關閉即可 平均數&#xff08;average&#xff09; 輸入3個整數&#xff0c;輸出它們的平均值&#xff0c;保留3位小數。 #include <stdio.h> int main() {int a, b, c;scanf("%d %d %d", &a, &…

修改樣式還能影響功能?是的!

最常見的幾種樣式導致按鈕點擊無效的情況&#xff1a; 1. pointer-events: none; &#x1f449; 點擊被徹底屏蔽 癥狀&#xff1a;按鈕完全不能點擊&#xff0c;事件不會觸發。 可能原因&#xff1a;這個樣式讓元素“無法響應鼠標事件”。 button {pointer-events: none; }…

ai決策平臺:AnKo如何推動引領智能化未來?

ai決策平臺&#xff1a;AnKo如何推動引領智能化未來&#xff1f; ai決策平臺正在改變企業運營模式&#xff0c;AnKo作為ai決策平臺的代表&#xff0c;為智能管理提供新方向。借助ai決策平臺&#xff0c;組織在效率與準確性上實現飛躍。ai決策平臺的力量正被廣泛認可。 ai決策…

開疆智能Profient轉ModbusTCP網關連接ABB機器人MODBUS TCP通訊案例

本案例是通過開疆智能Profinet轉ModbusTCP網關將西門子PLC與ABB機器人進行通訊 因西門子PLC采用Profinet協議&#xff0c;而ABB機器人采用的是ModbusTCP通訊。故采取此種方案。 配置過程&#xff1a; 1.MODBUS/TCP基于以太網&#xff0c;故ABB機器人在使用時需要有616-1PCIN…

2089. 找出數組排序后的目標下標——O(n)做法!

本題要求在一個已排序的數組 nums 中&#xff0c;找出所有等于目標值 target 的元素下標。若不存在這樣的元素&#xff0c;則返回 {-1, -1}。解決該問題有兩種主要方法&#xff1a;二分查找法和統計計數法。 二分查找法&#xff1a;首先對數組進行排序&#xff0c;然后通過二分…

pyspark測試樣例

from pyspark.sql import SparkSession from pyspark.sql.functions import col, lit, concat 創建 SparkSession spark SparkSession.builder.appName(“SparkSQLExample”).getOrCreate() 創建 DataFrame&#xff08;可以是從 CSV、JSON 等文件讀取&#xff09; data […

【AWS入門】AWS身份驗證和訪問管理(IAM)

【AWS入門】AWS身份驗證和訪問管理&#xff08;IAM&#xff09; [AWS Essentials] AWS Identity and Access Management (IAM) By JacksonML 眾所周知&#xff0c;AWS亞馬遜云科技位列全球云計算服務第一位&#xff0c;并且持續為廣大客戶提供安全、穩定的各類云產品和服務。…

HarmonyOS NEXT 適配高德地圖FlutterSDK實現地圖展示,添加覆蓋物和移動Camera

HarmonyOS NEXT 適配高德地圖 Flutter SDK 實現地圖展示&#xff0c;添加覆蓋物和移動 Camera 在現代移動應用開發中&#xff0c;地圖功能是許多應用的核心組成部分之一。HarmonyOS NEXT 提供了強大的跨平臺開發能力&#xff0c;而高德地圖 Flutter SDK 則為開發者提供了豐富的…

三鍵標準、多鍵usb鼠標數據格式

三鍵標準usb鼠標數據格式 滾輪上滾 滾輪下滾 鼠標快速上移 鼠標快速右移 鼠標快速左移 鼠標右鍵單擊_抬起 鼠標中鍵單擊_抬起 鼠標左鍵單擊_抬起 鼠標左鍵先按_右鍵再按_同時抬起 鼠標左右鍵同時按下_同時抬起 鼠標左右鍵同時按下_右鍵先抬 多鍵usb鼠標…

軟件架構風格系列(7):閉環控制架構

文章目錄 引言一、閉環控制架構&#xff1a;讓系統學會“自我調節”的魔法&#xff08;一&#xff09;從溫控系統理解核心原理&#xff08;二&#xff09;核心組件解析 二、架構設計圖&#xff1a;閉環控制的“四大核心環節”三、Java實戰&#xff1a;手寫一個智能溫控系統&…

Python中的組合數據類型

一、列表類型 列表是指一系列的按特定順序排列的元素組成。使用[]定義列表&#xff0c;元素與元素之間使用英文的逗號分隔&#xff0c;列表中的元素可以是任意的數據類型。 #直接使用[]創建 lst[hello,world,99.8,100] print(lst)#可以使用內置的list()函數創建列表 lst2list(h…

集合進階2

Java不可變集合、Stream流與方法引用深度解析 一、不可變集合&#xff08;Immutable Collections&#xff09;進階指南 1.1 不可變集合核心特性 防御性編程&#xff1a;防止外部修改數據&#xff08;如傳遞集合給第三方庫時&#xff09;線程安全&#xff1a;天然支持多線程讀…

MySQL企業版免費開啟,強先體驗

近期Oracle突然宣布&#xff0c;MySQL企業版面向開發者免費開放下載&#xff0c;這一消息瞬間引爆DBA圈。作為數據庫領域的“頂配車型”&#xff0c;企業版長期因高昂授權費讓中小團隊望而卻步&#xff0c;如今免費開放無異于“勞斯萊斯開進菜市場”。 本文將深度拆解企業版的…

數據要素及征信公司數據要素實踐

數據要素及征信公司數據要素實踐 1.數據要素的定義與核心特征2.征信公司應用數據要素的實踐路徑3.總結1.數據要素的定義與核心特征 數據要素是數字經濟時代的新型生產要素,指以電子形式存在、通過計算方式參與生產經營活動并創造價值的數據資源。 其核心特征包括: 新型生產…

Golang 范型

引言 Go 從 1.18 開始正式支持泛型&#xff0c;帶來了更強的類型抽象能力&#xff0c;使得我們可以編寫更通用、可復用的代碼。本文檔將介紹下泛型與應用的一些內容 什么是泛型 泛型&#xff08;Generic&#xff09;是一種允許你編寫“參數化類型”的編程方式。你可以將類型…

vue-ganttastic甘特圖label標簽橫向滾動固定方法

這個甘特圖之前插件里&#xff0c;沒有找到能固定label標簽在屏幕上的辦法&#xff0c;用css各種辦法都沒有實現&#xff0c;所以我我直接手寫定位&#xff0c;用js監聽滾動條滾動的距離&#xff0c;然后同步移動甘特圖label標簽&#xff0c;造成一種定位的錯覺&#xff0c;以下…

VS2017編譯openssl3.0.8

openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有:SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編解碼庫、證書請求(PKCS10)編解碼、數字證書編解碼、CRL編解碼、OCSP協議、數字證書驗證、P…