😁作者:日出等日落
🔔专栏:Linux
辛勤的蜜蜂永没有时间悲哀。 ——布莱克
目录
\r和\n的区别:
进度条小程序
git 命令行
Linux调试器:gdb的使用
背景
gdb的使用
gdb调试指令:
\r和\n的区别:
- \r:回车
- \n:换行
那么这两个有什么区别呢?
(1)让光标从第一行跳到第二行,但是光标只是垂直向下跳,并没有在第二行的开始。这个操作就是换行(\n)。
(2)在第二行让光标跳到最开始的位置,这个操作就是回车(\r)。
当只有\r时的运行结果:
只有回车,我们可以想象到运行的结果是什么样,答案是:什么都不显示。为什么呢?
- 回车之后,光标来到了文本行的开始位置,此时linux的命令行就会从光标处开始,将我们的文本覆盖掉,我们就什么也看不到
当只有\n时的运行结果:
此时test.c文件有\n(行缓冲区内容打印)
此时运行,打印出hello world 这时光标会停3秒
如果没有\n,会先停3秒然后再打印出hello world
无论是否有\n时,都是先走printf再sleep的,当有\n时如果读到了\n的位置就会先将行缓冲区的内容马上打印出来再往下走。
注意:fflush函数可以立马刷新行缓冲区
当\r和\n同时再的时候:
进度条小程序
#include "proc.h"
2
3
4 #define SIZE 102
5 #define STYLE '='
6 #define ARR ">"
7
8 void process()
9 {
10 const char *lable = "|/-\\";
11 char bar[SIZE];
12 memset(bar, '\0', sizeof(bar));
13 int i = 0;
14 while( i <= 100 )
15 {
16 printf("[\033[42;32;31m%-100s\033[0m][%d%%][%c]\r", bar, i, lable[i%4]);
17 fflush(stdout);
18 bar[i++] = STYLE;
19
20 usleep(100000);//usleep是微秒,1秒等于1000000微秒
21 }
22 printf("\n");
23 }
proc.h文件:
#include<stdio.h>
#pragma once
extern void proc();
git 命令行
检查Linux是否安装git:
git --version
如果没有,安装指令是
sudo yum install -y git
clone一个远端仓库:
复制仓库的链接
在Linux中创建远端仓库:
git clone 链接
提交代码带Git:
git add 文件名
提交当前目录下的所有代码
git commit -m “文字描述”
最后推送到远程:
git push
第一次在Linux提交代码的会出现这个情况:
这里需要你设置邮箱和名字
git config --global user.name"你的名字"
git config --global user .email"你的邮箱"
Linux调试器:gdb的使用
背景
- 程序的发布方式有两种,debug模式和release模式
- Linux gcc/g++出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
debug为可以调试的版本,release为优化后的版本也就是测试版本了
Linux gcc/g++出来的是二进制文件,默认是release版本。
在VS中,我们可以按F10进入调试
在Linux我们依旧可以调试,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
gdb的使用
gdb 文件名
gcc生成后默认是release版本,因此是不可以调试的
查看调试信息
readelf -S 文件名
gdb调试指令:
- list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
- list/l 函数名:列出某个函数的源代码。
- r或run:运行程序。
- n 或 next:单条执行(逐过程执行)。
- s或step:进入函数调用(逐语句执行)
- break(b) 行号:在某一行设置断点 break 函数名:在某个函数开头设置断点
- d 编号 :删除断点
- info break :查看断点信息。
- finish:执行到当前函数返回,然后停下来等待命令
- print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值。
- set var:修改变量的值
- continue(或c):从当前位置开始连续而非单步执行程序
- run(或r):从开始连续而非单步执行程序
- delete breakpoints:删除所有断点
- delete breakpoints n:删除序号为n的断点
- disable breakpoints:禁用断点
- enable breakpoints:启用断点
- info(或i) breakpoints:参看当前设置了哪些断点
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay:取消对先前设置的那些变量的跟踪
- until X行号:跳至X行
- breaktrace(或bt):查看各级函数调用及参数
- info(i) locals:查看当前栈帧局部变量的值
- quit:退出gdb