当前位置: 首页 > news >正文

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_modulesvenv

  • 日志文件(如 .log.tmp

  • 敏感信息(如 .env, 密钥文件)

2). 拉取远程最新代码并合并
git pull origin master重新推送代码
git push origin master

到这里,我们简单的git操作就完成了,更多的内容等待up慢慢学习完再进行总结写作。

三.调试器 - gdb/cgdb使用


gbd和cgbd我更推荐大家使用cgbd 

功能GDBCGDB
源码查看需手动输入 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


http://www.mrgr.cn/news/99164.html

相关文章:

  • ZYNQ笔记(十):XADC (PS XDAC 接口)
  • HarmonyOS 笔记
  • 深度可分离卷积与普通卷积的区别及原理
  • Few-shot medical image segmentation with high-fidelity prototypes 论文总结
  • 51c大模型~合集119
  • 位运算,状态压缩dp(算法竞赛进阶指南学习笔记)
  • 算法导论思考题
  • WInform当今技术特性分析
  • Java中的锁
  • Matplotlib的应用
  • (一)mac中Grafana监控Linux上的CPU等(Node_exporter 安装使用)
  • STM32的三种启动方式
  • 安卓学习24 -- 网络
  • AnimateCC基础教学:制作一个打地鼠简化版
  • 06 GE Modifier
  • 使用注解方式整合ssm时,启动tomcat扫描不到resource下面的xxxmapper.xml问题,解决方法
  • dawgctf 2025 writeup
  • 从零起步的Kaggle竞赛 - BirdCLEF2025
  • Python多任务编程:进程全面详解与实战指南
  • 实现AWS Lambda函数安全地请求企业内部API返回数据