Linux 入门:基础开发工具(下)git,cgdb操作指南
目录
一.进度条
一).补充:回车与换行
二).行缓冲区
三).进度条代码
二.版本控制器Git
一).Git 安装与配置
二).创建仓库
三).开始操作
1.简单流程
2.配置公钥
1).身份认证
2). 生成 RSA 密钥
3).获取 RSA 公钥内容,并配置到 SSH公钥 中
4).公钥添加测试
编辑
3.git clone
4.gitee 三板斧
1).git add
2).git commit
3).git push
5.补充
1).gitignore 是 Git 版本控制中的一个配置文件,进行后缀过滤
2). 拉取远程最新代码并合并
三.调试器 - gdb/cgdb使用
一).认识
二).常用指令
1.安装与启动
2.常用快捷键
3.运行程序
4.断点管理
5.执行控制
6.查看数据
7.补充
一.进度条
一).补充:回车与换行
-
CR (
\r
):光标回到行首,不换行。 -
LF (
\n
):光标下移一行,不回到行首。
在计算机中 \n被默认设置为 \r + \n
二).行缓冲区
执行两段代码,观察不同
#include <stdio.h>
int main()
{printf("hello bite!\n");sleep(3);return 0;
}
#include <stdio.h>
int main()
{printf("hello bite!");sleep(3);return 0;
}
有了上面的知识储备,我们来写一个倒计时程序
#include <stdio.h>
#include <unistd.h>
int main()
{int i = 10;while(i >= 0){printf("%-2d\r", i); // \nfflush(stdout);i--;sleep(1);} printf("\n");return 0;
}
三).进度条代码
#include "process.h"
#include <string.h>
#include <unistd.h>void process_v1()
{char buffer[NUM];memset(buffer, 0, sizeof(buffer));const char* lable = "|/-\\";int len = strlen(lable);int cnt = 0;while (cnt <= 100){printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt % len]);fflush(stdout);buffer[cnt] = STYLE;cnt++;usleep(5000);}printf("\n");
}
但是对于上面的代码是无法运用到实际的场景的。我们的进度条要进行实际的分析,并不是简单的循环计算。
process.c
#include "process.h" #include <string.h> #include <unistd.h> #define NUM 101 #define STYLE '='void FlushProcess(double total, double current) {char buffer[NUM];memset(buffer, 0, sizeof(buffer));const char* lable = "|/-\\";int len = strlen(lable);static int cnt = 0;// 不需要自己循环填充#int num = (int)(current * 100 / total); // 11.0 / 1000int i = 0;for (; i < num; i++){buffer[i] = STYLE;} double rate = current / total;cnt %= len;printf("[%-100s][%.1f%%][%c]\r", buffer, rate * 100, lable[cnt]);cnt++;fflush(stdout); }
process.h
#pragma once #include <stdio.h>void FlushProcess(double total, double current);
main.c
#include "process.h" #include <stdio.h> #include <unistd.h>double total = 1024.0; double speed = 1.0; void DownLoad() {double current = 0;while (current <= total){FlushProcess(total, current);// 下载代码usleep(3000); // 充当下载数据current += speed;} printf("\ndownload %.2lfMB Done\n", current); }int main() {DownLoad();DownLoad();DownLoad(); }
Makefile
SRC = $(wildcard * .c) OBJ = $(SRC:.c = .o) BIN = processbar$(BIN) :$(OBJ)gcc - o $@ $ ^ %.o: % .cgcc - c $ <.PHONY : clean :rm - f $(OBJ) $(BIN)
二.版本控制器Git
今天来学习一下如何在linux云服务器上使用git。我使用的是Linux的ubuntu系统来进行操作。
一).Git 安装与配置
# Ubuntu
sudo apt install git -y# CentOS
sudo yum install git -y# Arch Linux
sudo pacman -S git
使用git version可以查看是否安装完成,查看git的版本
git version
二).创建仓库
这里我们使用gitee来进行操作
这里我们的仓库就创建好了
三).开始操作
1.简单流程
[工作目录] --git add--> [暂存区] --git commit--> [本地仓库] --git push--> [远程仓库]▲ ││ git checkout -- <file> │└─────────────────────────────────────┘
2.配置公钥
1).身份认证
为确保提交的代码身份被 Gitee 正确识别,我们要先进行认证操作
git config --global user.name '球求了'
git config --global user.email '1592266073@qq.com'
2). 生成 RSA 密钥
ssh-keygen -t rsa
3).获取 RSA 公钥内容,并配置到 SSH公钥 中
cat ~/.ssh/id_rsa.pub
4).公钥添加测试
ssh -T git@git.oschina.net
3.git clone
克隆现有仓库
git clone git@gitee.com:ball-begging/linux1.git
复制粘贴到Linux的命令行里(注意:要使用鼠标右击复制)
4.gitee 三板斧
1).git add
# 添加单个文件
git add test.c# 添加所有修改文件
git add .
我们可以使用git status 查看当前状态
# 查看当前状态
git status# 简略状态显示
git status -s
2).git commit
git commit 主要是将暂存区里的文件给提交到本地的仓库。
# 提交到本地仓库
git commit -m "提交说明"# 组合操作(添加所有修改并提交)
git commit -am "组合提交说明"
请注意,提交声明不要乱写,都是可以查看的
# 查看提交历史
git log# 图形化显示历史
git log --graph --oneline --all
3).git push
# 推送本地到远程
git push
5.补充
1).gitignore
是 Git 版本控制中的一个配置文件,进行后缀过滤
避免将以下文件提交到仓库:
-
编译产物(如
.class
,.exe
,.o
) -
本地配置文件(如 IDE 的
.idea
,.vscode
) -
依赖目录(如
node_modules
,venv
) -
日志文件(如
.log
,.tmp
) -
敏感信息(如
.env
, 密钥文件)
2). 拉取远程最新代码并合并
git pull origin master重新推送代码
git push origin master
到这里,我们简单的git操作就完成了,更多的内容等待up慢慢学习完再进行总结写作。
三.调试器 - gdb/cgdb使用
gbd和cgbd我更推荐大家使用cgbd
功能 | GDB | CGDB |
---|---|---|
源码查看 | 需手动输入 list | 自动分屏显示源码 |
断点管理 | 命令行操作 | 可视化设置/删除 |
交互体验 | 纯命令行 | 类 IDE 分屏 |
-
定位:基于 GDB 的文本界面调试工具,提供分屏界面(上方显示源码,下方输入 GDB 命令)。
-
优势:
-
直观查看源码和断点位置。
-
支持快捷键操作(类似 Vim 的键位)。
-
兼容所有 GDB 命令
-
一).认识
- 程序的发布方式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的二进制程序,默认是 release 模式。
- 要使用cgdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,如果没有添加,程序无法被编译。
gcc mycmd.c -o mycmd # 默认模式,不支持调试gcc mycmd.c -o mycmd -g # debug模式 可以调试
使用的代码:
#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;}
二).常用指令
1.安装与启动
# Ubuntu
sudo apt install cgdb
cgdb my_program.exe # 直接调试程序
注意:cgdb后面跟的的是可执行文件,而不是源文件
2.常用快捷键
快捷键 | 说明 |
---|---|
ESC | 切换到源码窗口 |
i | 切换到 CGDB 命令窗口 |
q | 退出调试 |
3.运行程序
run / r 从头运行程序start 停在 main 函数入口
list / l 显示源码,从上次位置开始
n / next 单步执行,不进入函数内部 s / step 单步执行,进入函数内部
4.断点管理
break main / b main 在 main 函数开头设断点b file.c:20 / b 20 在 file.c 的第 20 行设断点b func_name 在函数 func_name 处设断点
info break / info b 查看所有断点
delete <num> / d <num> 删除指定编号的断点
注意:删除断点只能通过编号删除,不能指定行号删除
disable / enable <num> 禁用/启用断点
5.执行控制
continue / c | 继续运行到下一个断点 |
next / n | 单步执行(不进入函数) |
step / s | 单步执行(进入函数) |
finish | 执行到当前函数返回 |
until | 运行到当前循环结束 |
6.查看数据
print var / p var | 打印变量值 |
ptype var | 查看变量类型 |
info locals / i locals | 查看当前栈帧的局部变量 |
info args | 查看函数参数值 |
backtrace / bt | 查看函数调用栈(堆栈回溯 |
7.补充
- 1.watch:执行时监视一个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,CGDB 会暂停程序的执行,并通知使用者。
注意:如果你有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你.
- 2.set var确定问题原因
- 3.条件断点
1.添加条件断点
2.给已经存在的端点新增条件
注意:
条件断点添加常见两种方式:1. 新增 2. 给已有断点追加
注意两者的语法有区别,不要写错了。
新增: b 行号/文件名:行号/函数名 if i == 30(条件)
给已有断点追加:condition 2 i == 30, 其中2是已有断点编号,没有if