0


Linux下的常见工具的简单使用

**个人主页:欢迎大家光临——>**沙漠下的胡杨

** 各位大帅哥,大漂亮**

如果觉得文章对自己有帮助

可以一键三连支持博主

** 你的每一分关心都是我坚持的动力**

** **

☄:本期重点:Linux下的工具使用

** 希望大家每天都心情愉悦的学习工作。**


Linux下编写代码对比windows下的IDE:

首先我们了解windows我们的代码编写,一般是在集成开发环境(IDE)中来写代码,这个IDE下我们对于代码的编写,调试,运行,都是在这个这一个工具下完成的,比如常见的VS系列,我们对于代码的所有工作,都依赖于这个环境。

而在Linux下,我们的对代码的一些工作,被分为好几个工具来进行,比如我们Linux常见的代码编辑器vim,常见的编译,链接使用的是gcc或者g++(对于C/C++而言),常见的自动化构建工具make/Makefile,常见的调试器gdb,还有git工具的使用,我们把工程上传到gitee的远端仓库。

最后我们在windows下载工具和Linux也不太相同,windows下我们直接使用应用商店,或者网上的下载链接。Linux下我们使用yum工具帮助我们进行下载(Centos系列)。

有了上述的一些介绍我们发现在Linux下写代码,我们需要掌握一些工具,下面我们来进行学习吧。

vim 文本编辑器:

vim是一款多模式的编辑器,我们可以在vim中写代码,代码中的错误或者bug在vim下是不会提示的。因为在Linux下代码的编写和编译链接过程是独立的。

我们在vim下有很多的模式,我们需要了解以下三个模式:

正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段。
插入模式(Insert mode)
只有在插入模式,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下shift+: 即可进入该模式。

要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes

首先对于我们来说,其中最终重要的模式是命令模式,因为我们在插入模式下,我们最常见的就是写代码,没什么重要的,在底行模式下我们一般就是保存退出,也没什么重要的,而我们在命令模式下,我们可以进行查找,替换,复制粘贴的操作,这些都必须在命令模式下进行操作。

首先我们可以使用vim打开文件,也可以使用vim创建文件,我们刚进入vim时我们默认的打开模式是命令模式,如果我们要写代码,那么必须进入插入模式( i ),然后我们要保存退出,我们在插入模式下按下 Esc 键进行退出插入模式进入命令模式,接着我们输入shift + ;进入底行模式,输入wq保存并退出,我们也可以在q或者w后加上!表示强制的意思。

命令模式下命令操作:

移动光标:

我们在命令模式下移动光标,可以使用上下左右,也可以使用 j k h l(分别对应上下左右)。

shift+g ==》G,其实就是输入G(大写的G):移动到文章末尾

shift+4 ==》$, 其实就是输入$ 键:移动到本行的末尾

shift+6 ==》^,其实就是输入^键:移动到本行的开始

按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
复制
「yw」:将光标所在之处到字尾的字符复制。
「#yw」:复制#个字符。
「yy」:复制光标所在行。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将复制的字符贴到光标所在位置。
注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

撤销上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次恢复。
「ctrl + r」: 撤销的恢复

跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首

shfit+r进入替换模式:

(下面的命令在替换模式下进行)

删除文字:
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行
「#dd」:从光标所在行开始删除#行

替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字

底行模式下的命令:

set nu/nonu :打开关闭行号

vs文件名:实现分屏操作

Ctrl按住不动w快速摁两次:在分屏操作中切屏。

!cmd:不退出vim执行相对应的命令(执行命令行,编译,运行查看man等)

help vim-modes :查看我们当前处于的模式。

wq:保存并退出。

!wq:强制保存退出。

查找字符
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按
「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直
按「n」会往前寻找到您要的关键字为止
上述是关于我们vim的一些基本操作,相对而言没有难度,只是我们需要强加练习。

下面我们来简单看一下怎么配置vim吧。

在我们的工作目录下,通常有一个叫做 .vimrc的文件,使用vim打开这个文件我们就可以进行相对应的配置vim的文件,比如我们的显示行号,显示语法高亮等等,这些我们都可以进行相对应的配置。(如果没有,我们可以使用vim自己创建一个.vimrc的文件进行配置)

我们可以一条条命令配置vim,也可以使用别人配置好的我们直接在Linux下载。具体如下:

vim的配置文件

关于vim我们暂时只要了解这么多就好啦。

gcc 和 g++代码编译器

首先我们的gcc编译的代码是C语言的代码,而g++一般我们是编译C++的代码,而上述两种语言都要经过一下四步:

1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)(可重定向二进制目标文件)
4. 链接(生成可执行文件或库文件)

预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。

实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

这是我们写的hello.c文件,下面我们进行下预处理:

[ssh@VM-4-10-centos 22.7.29]$ vim hello.c 
[ssh@VM-4-10-centos 22.7.29]$ gcc -E hello.c -o hello.i 
[ssh@VM-4-10-centos 22.7.29]$ ll
-rw-rw-r-- 1 ssh ssh   361 Jul 29 18:42 hello.c
-rw-rw-r-- 1 ssh ssh 16945 Jul 29 18:43 hello.i

我们对比可知,我们的原代码只有21行,而在 hello.i 中的代码有大概900行了,这些代码是从哪里来的呢?是我们的头文件展开而来的。而且其中的注释和宏都不见了,宏直接变成数字,而注释变成空白。条件编译也只有符合条件的部分了。

编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s

我们进行下编译阶段,我们发现原来是C语言的代码,现在变成了汇编代码。

[ssh@VM-4-10-centos 22.7.29]$ gcc -S hello.i -o hello.s
[ssh@VM-4-10-centos 22.7.29]$ ll
total 28
-rw-rw-r-- 1 ssh ssh   361 Jul 29 18:49 hello.c
-rw-rw-r-- 1 ssh ssh 16945 Jul 29 18:49 hello.i
-rw-rw-r-- 1 ssh ssh   592 Jul 29 18:53 hello.s

汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标文件了
实例: gcc –c hello.s –o hello.o

我们进行下汇编,发现此时的代码我们完全看不懂,此时就由汇编变成了可重定向目标文件(二进制文件)

[ssh@VM-4-10-centos 22.7.29]$ gcc -c hello.s -o hello.o
[ssh@VM-4-10-centos 22.7.29]$ ll
total 32
-rw-rw-r-- 1 ssh ssh   361 Jul 29 18:49 hello.c
-rw-rw-r-- 1 ssh ssh 16945 Jul 29 18:49 hello.i
-rw-rw-r-- 1 ssh ssh  1672 Jul 29 18:55 hello.o
-rw-rw-r-- 1 ssh ssh   592 Jul 29 18:54 hello.s

链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段
实例: gcc hello.o –o hello

我们最后把这个可重定向二进制目标文件,链接成可执行文件。

[ssh@VM-4-10-centos 22.7.29]$ gcc hello.o -o hello
[ssh@VM-4-10-centos 22.7.29]$ ll
total 44
-rwxrwxr-x 1 ssh ssh  8408 Jul 29 18:58 hello
-rw-rw-r-- 1 ssh ssh   361 Jul 29 18:49 hello.c
-rw-rw-r-- 1 ssh ssh 16945 Jul 29 18:49 hello.i
-rw-rw-r-- 1 ssh ssh  1673 Jul 29 18:56 hello.o
-rw-rw-r-- 1 ssh ssh   592 Jul 29 18:54 hello.s
[ssh@VM-4-10-centos 22.7.29]$ ./hello 
M: 100
hello huyang6
RELEASE

最后的链接过程需要我们使用动,静态库,下面我们先对动静态库简单理解一下。

我们可以使用ldd命令,来查看我们这个文件所以依赖的库。

[ssh@VM-4-10-centos 22.7.29]$ ldd hello
    linux-vdso.so.1 =>  (0x00007fffc4be8000)
    /$LIB/libonion.so => /lib64/libonion.so (0x00007fb4324e9000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fb432002000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fb431dfe000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb4323d0000)

其中Linux下的动态库是以 .so 结尾的库 静态库是以 .a结尾的。在windows下,我们的动态库是以 .dll 结尾的,静态库是以 .lib结尾的。我们在编写C或者C++代码是,通常要写头文件,这些头文件中包含的是什么呢?这些头文件中包含的是我们代码中所用函数或者其他方法的声明,而函数的实现不在所谓的头文件中,而是在我们的C库中,我们链接时,是要把我们的可重定向二进制目标文件和我们的动态库或者静态库产生链接的,因为我们在预处理阶段就把我们的头文件进行展开了,其中包含了函数的声明,我们只要在和库中函数的实现链接起来,就可以生成可执行文件了。在换句话说,我们的C/C++程序离不开库文件的。

动态链接:

 我们动态链接需要**动态库(.so)**,并且我们**一般的生成可指向程序的默认链接都是动态链接。****动态链接,就是把我们所使用函数的地址给传过去**,比如我们调用 printf 函数,这个函数我们没有实现,我们只是用头文件来获取函数的声明,但是函数的地址对于我们来说,是不知道,所以我们动态链接的过程,就是把 printf 函数的地址给我们链接上,这样我们可以通过函数地址来进行函数的调用了,**这个过程就是动态链接,动态链接比较节省资源。**

我们可以通过 ldd 命令来查看我们的可执行程序所以依赖的库,也可以通过 file 命令看出我们这个可执行程序此时链接的库为动态库。

[ssh@VM-4-10-centos 22.7.29]$ ldd  hello
    linux-vdso.so.1 =>  (0x00007ffd707fe000)
    /$LIB/libonion.so => /lib64/libonion.so (0x00007f1d776dc000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f1d771f5000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f1d76ff1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1d775c3000)
[ssh@VM-4-10-centos 22.7.29]$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c9444fe1bbd3c45f92c673d675bac0e32ea1300a, not stripped

静态链接:

   我们一般默认链接时使用动态库,所谓的静态链接就是把函数的实现,直接拷贝到我们的可执行程序中,比如 printf 函数,我们在头文件中有函数的声明了,但是我们没有函数的具体实现,我们通过静态链接的方式,直接把函数的实现过程拷贝过来了,这样我们就可以正常的执行我们的可执行程序了。**静态链接比较占用资源。**

我们可以执行gcc相对应生成可执行程序的命令,在最后我们只需要加上 -static就可以生成静态链接的可执行程序了。我们查看还是ldd 和 file 这两条命令。

[ssh@VM-4-10-centos 22.7.29]$ gcc hello.c -o hello_static -static
[ssh@VM-4-10-centos 22.7.29]$ ll
[ssh@VM-4-10-centos 22.7.29]$ ll
total 860
-rwxrwxr-x 1 ssh ssh   8408 Jul 29 18:58 hello
-rw-rw-r-- 1 ssh ssh    361 Jul 30 10:16 hello.c
-rwxrwxr-x 1 ssh ssh 861384 Jul 30 10:17 hello_static
[ssh@VM-4-10-centos 22.7.29]$ ldd hello_static 
    not a dynamic executable
[ssh@VM-4-10-centos 22.7.29]$ file hello_static 
hello_static: ELF 64-bit LSB executable, x86-64,
version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=b7a842a331551e98da94b792dc3ee8ccd7488839, not stripped

上面也能够看出静态链接的文件比动态链接的文件大太多了。

make和Makefile自动化构建项目

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

首先对于make和Makefile我们现在只要会编写Makefile文件,并且使用make命令来自动化构建生成项目,以及清理项目即可,最后我们还需要了解下 .PHONY的作用,以及我们acm时间判断我们的可执行程序是否是最新的。

编写Makefile文件:

   对于Makefile文件编写中我们最重要的是对于**依赖关系**和**依赖方法**的构建,依赖关系就是我们这个目标文件是依赖于哪些文件所形成的,依赖关系是我们的怎么有这些文件怎么构建我们的目标文件。

下面我们来创建一个简单的Makefile文件,并且来编写Makefile,首先我们先创建三个文件,分别放函数的声明,函数的实现,函数的使用,来帮助我们完成Makefile的构建。

在这上面,我们只写了一个简单的打印函数,我们一般采用多文件构建可执行程序时,我们采用 main.o,test.o,以及C语言提供的动态库进行链接来形成可执行程序,但是我们的main.o 和 test.o文件还要分别依赖我们的 main.c 和 teat.c,这样就构成了所谓的依赖关系,我们的依赖方法就是通过gcc编译。

Makefile 的编写,有了上述的依赖关系和方法我们直接进行编写即可,有以下注意事项:

1.我们的依赖方法必须以Tab键开始。

2.我们一般只在清理文件时才会加上.PHONY。

3.其中.PHONY是一个在Makefile下的关键字,意思是总是被执行。

我们先来看下我们的Makefile吧,以及执行后的效果:

[ssh@VM-4-10-centos test_make]$ ll
total 16
-rw-rw-r-- 1 ssh ssh  61 Jul 30 12:11 main.c
-rw-rw-r-- 1 ssh ssh 170 Jul 30 13:04 Makefile
-rw-rw-r-- 1 ssh ssh  67 Jul 30 12:10 test.c
-rw-rw-r-- 1 ssh ssh  54 Jul 30 12:11 test.h
[ssh@VM-4-10-centos test_make]$ make
gcc -o test.o -c test.c
gcc -o main.o -c main.c
gcc -o mytest main.o test.o
[ssh@VM-4-10-centos test_make]$ ll
total 36
-rw-rw-r-- 1 ssh ssh   61 Jul 30 12:11 main.c
-rw-rw-r-- 1 ssh ssh 1368 Jul 30 13:04 main.o
-rw-rw-r-- 1 ssh ssh  170 Jul 30 13:04 Makefile
-rwxrwxr-x 1 ssh ssh 8416 Jul 30 13:04 mytest
-rw-rw-r-- 1 ssh ssh   67 Jul 30 12:10 test.c
-rw-rw-r-- 1 ssh ssh   54 Jul 30 12:11 test.h
-rw-rw-r-- 1 ssh ssh 1496 Jul 30 13:04 test.o
[ssh@VM-4-10-centos test_make]$ ./mytest 
hello Makefile
[ssh@VM-4-10-centos test_make]$ make clear
rm -f *.o mytest 
[ssh@VM-4-10-centos test_make]$ ll
total 16
-rw-rw-r-- 1 ssh ssh  61 Jul 30 12:11 main.c
-rw-rw-r-- 1 ssh ssh 170 Jul 30 13:04 Makefile
-rw-rw-r-- 1 ssh ssh  67 Jul 30 12:10 test.c
-rw-rw-r-- 1 ssh ssh  54 Jul 30 12:11 test.h

我们发现我们可以使用 make 自动的来生成所谓的可执行文件,并且我们还可以使用make clear这个命令来清理我们的项目。不用每次在使用 gcc 进行编译了,并且我们如果修改了源文件的内容,我们还能够使用make来直接编译生成可执行程序。相当于我们一次写好了makefile之后我们就不用再每次修改源文件都是用gcc编译了。

关于ACM时间以及 .PHONY(总是执行)的含义:

**我们能不能多次使用 make 来生成可执行程序呢? **

[ssh@VM-4-10-centos test_make]$ make
gcc -o test.o -c test.c
gcc -o main.o -c main.c
gcc -o mytest main.o test.o
[ssh@VM-4-10-centos test_make]$ make
make: `mytest' is up to date.
[ssh@VM-4-10-centos test_make]$ make
make: `mytest' is up to date.

我们发现在生成一个mytest,就不能再 make ,它说这个mytest已经是最新的了。可是我们怎么知道这个mytest是最新的呢?或者说我们修改后,他怎么知道我们的代码改变了呢?这都可以用ACM时间来解释,首先我们的mytest文件的依赖关系是 test.o 和 main.o,而他们的依赖关系最终都指向了 test.c 和 main.c。换句话说,我们的 mytest 的文件生成时间一定是比这上面两个时间要晚的,如果不是这样,那么说明了我们对上面两个文件的又进行了操作,此时的代码可能会变化,我们可以通过 mytest 和 test.c main.c的ACM时间来进行判断文件是否是最新的,判断是否需要重新生成所以。

ACM时间查看:

我们使用 stat +文件名可以查看该文件的ACM时间。

其中A表示 Access是指文件最后被访问的时间(因为Linux的特性,访问文件太过于频繁,所以这个时间一般不会及时更新)

其中M表示Modify是指文件内容的最新修改时间。

其中C表示Change是指文件属性的最近修改时间。

如果我们对文件进行修改,那么它的ACM时间就会发生改变,那么我们就可以通过mytest和main.c test.c的最后时间来决定要不要进行重新生成。

[ssh@VM-4-10-centos test_make]$ vim test.c
[ssh@VM-4-10-centos test_make]$ make 
gcc -o test.o -c test.c
gcc -o mytest main.o test.o

我们此时只是打开test.c然后我们在关闭test.c,接着make,发现我们就可以重新生成了,这就是对 test.c 的 ACM时间修改导致我们的 mytest 的ACM比test.c的时间要早,我们make要对其重新生成。

那么如何让 make 每次都能生成mytest呢?

我们只要在Makefile中的mytest的依赖关系前,加上.PHONY:mytest 即可。

[ssh@VM-4-10-centos test_make]$ make
gcc -o mytest main.o test.o
[ssh@VM-4-10-centos test_make]$ make
gcc -o mytest main.o test.o
[ssh@VM-4-10-centos test_make]$ make
gcc -o mytest main.o test.o

所以,我们的这个.PHONY就是总是要执行的,无论是不是最新的都要执行。

yum 安装软件

我们先了解下我们一般在手机上安装软件的过程。

而在Linux下,我们的yum工具实际上就相当于是手机的应用市场,而服务器就相当于是我们Linux下的软件发布平台,我们可以通过yum工具来进行搜索,下载安装,移除某个软件。

因为Linux平台开源的特性,所以导致我们可以在官方的平台上下载软件,也可在非官方的平台下下载。

yum源的问题:

yum源简单说就是一个配置文件,我们可以查看我们的yum源,也可以进行配置相关的yum源, 我们一般下载软件,就要去yum源中进行下载。我们打开其中一个yum源中就可以看出我们的yum源中有大量的链接,我们也可直接通过网页的形式进行浏览。

yum的三板斧:

1.yum list 罗列出我们所有所有能下载的软件。

一般我们使用搜索搭配使用,叫做yum list | grep 【搜索的字符】

其中grep 的作用:

查找文件里符合条件的字符串,常与管道符

| 

一起使用;主要用于查找文件中符合条件的字符串、统计文件中符合条件的字符串行数。

2.yum install -y 软件,安装软件,其中-y表示安装过程中所有行为默认同意(使用root权限)

3.yum remove 你的软件,移除软件。(root权限)

我们后续如果有需要下载的就可以直接下载啦。

gdb 代码调试器:

程序的发布方式有两种,debug模式和release模式Linux gcc/g++出来的二进制程序,默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。下面我们来简单看下gdb的使用。

我们还是编写一个简单代码,并且使用Makefile工具自动化构建下项目。这里我们的构建mytest的依赖方法中,使用gcc的部分加上了 -g,表示程序时debug版本的。

[ssh@VM-4-10-centos 22.7.31]$ ll
total 8
-rw-rw-r-- 1 ssh ssh  76 Jul 31 18:29 Makefile
-rw-rw-r-- 1 ssh ssh 228 Jul 31 18:38 test.c
[ssh@VM-4-10-centos 22.7.31]$ cat Makefile 
mytest:test.c
    gcc -o mytest test.c -g

.PHONY:clean
clean:
    rm -rf mytest 
[ssh@VM-4-10-centos 22.7.31]$ cat test.c 
#include <stdio.h>
int GitAdd(int n)
{
    int sum = 0;
    int i = 0;
    for(i = 0;i <= n;i++)
    {
        sum += i;
    }
    return sum;
}
int main()
{
    int num = 100;
    printf("%d\n",GitAdd(num));
    return 0;
}

如果在 gdb 下直接输入回车,那么就会自动执行最近在gdb中执行的命令。

1.打开 gdb 和关闭 gdb,显示调试文件内容。

我们可以使用gdb 文件名 ,来打开gdb。

[ssh@VM-4-10-centos 22.7.31]$ gdb mytest.c 

我们退出gdb,输入quit或者(Ctrl+d)

(gdb) quit

我们使用 l(list)可以查看调试文件内容(默认是10行):

我们一般使用 l 0 ,然后再回车,查看调试文件的所有内容:

其中 l 0,是从文件的第一行显示内容,默认显示10行,回车就是表示执行最近执行过的一条命令。

我们还可以通过函数名来查看部分代码内容,l 函数名,如果函数没有显示完,可以接着按回车键:

2.设置断点,查看断点,删除断点

设置断点我们使用b+行号:

(gdb) b 17
Breakpoint 1 at 0x40056a: file test.c, line 17.
(gdb) b 19
Breakpoint 2 at 0x40058c: file test.c, line 19.

我们也可以根据函数名,在函数的最开始设置断点:

(gdb) b GitAdd 
Breakpoint 3 at 0x400534: file test.c, line 5.

查看断点info b:

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040056a in main at test.c:17
2       breakpoint     keep y   0x000000000040058c in main at test.c:19
3       breakpoint     keep y   0x0000000000400534 in GitAdd at test.c:5

删除断点 d + 断点序号:

3.执行程序,逐语句执行,逐过程执行,断点执行。

我们使用 r 执行程序,如果没有断点那么就执行完代码,有断点,就停在第一个断点处

逐过程执行 n :我们会一条条语句的执行,如果是函数,那么会直接执行完函数,接着执行函数的下一行,下面是逐过程进行执行,发现我们的函数没有进入。

Breakpoint 4, main () at test.c:17
17        int num = 100;
(gdb) n
18        printf("%d\n",GitAdd(num));
(gdb) n
5050

Breakpoint 2, main () at test.c:19
19        return 0;
(gdb) n
20    }
(gdb) 
0x00007ffff7a2f555 in __libc_start_main () from /lib64/libc.so.6

逐语句执行 s :我们会一条条语句的执行,如果是函数,那么会直接进入函数,接着执行函数,下面是逐过程进行执行,我们会进入函数体。

断点执行 c :我们可以使用 c 来执行到下一个断点处。

4.显示变量,常显示,取消常显示

我们要显示变量使用 p 变量名:

我们发现此时的变量名不能够常住式的显示出来,我们常显示需要 display +变量名,我们可以进行常显示:

取消常实现:undisplay +常显示变量序号数:

** 5.调用堆栈,快速执行完当前函数**

我们使用 bt 可以查看当前的调用堆栈情况:

(gdb) bt
#0  GitAdd (n=100) at test.c:9
#1  0x000000000040057b in main () at test.c:18

我们可以使用finish,来快速执行完当前函数:

6.until:快速跳转至指定行(不建议跨函数使用)

git简单使用:

首先我们先在gitee上创建一个仓库,然后把仓库的网址克隆到本地,然后我们就是正式的使用git,还是只有三板斧:

1.git add 文件(必须在该目录下)

**2.git commit -m “日志” **

这一步就是把文件提交到本地仓库,其中我们日志是必须要写,主要是明确本次提交是做了什么事情。

3.git push把文件推送到远程仓库。

标签: linux

本文转载自: https://blog.csdn.net/m0_64770095/article/details/126050170
版权归原作者 沙漠下的胡杨 所有, 如有侵权,请联系我们删除。

“Linux下的常见工具的简单使用”的评论:

还没有评论