一、Git
1.1 版本控制器
1. 2 git來源
- 速度
- 簡單的設計
- 對?線性開發模式的強??持(允許成千上萬個并?開發的分?)
- 完全分布式
- 有能??效管理類似 Linux 內核?樣的超?規模項?(速度和數據量)
1. 3 安裝git
sudo yum install git
1. 4 git三板斧?
- git add .
- ?git commit 提交改動到本地,提交的時候應該注明提交?志, 描述改動的詳細內容.
- 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
??
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