Linux 入门:基础开发工具(下)git,cgdb操作指南

发布于:2025-04-21 ⋅ 阅读:(29) ⋅ 点赞:(0)

目录

一.进度条

一).补充:回车与换行 

二).行缓冲区

三).进度条代码 

二.版本控制器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); // \n
        fflush(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 / 1000
	int 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: % .c
    gcc - 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 

功能 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


网站公告

今日签到

点亮在社区的每一天
去签到