• 【Linux】第十站:git和gdb的基本使用


    一、git的基本操作

    1.gitee新建仓库注意事项

    如下所示,是我们的新建仓库时候的注意事项

    image-20231102174122943

    我们需要注意的是

    我们要选择开源

    对于这个初始化仓库,我们现在可选可不选,选的话按照我们当前的语言即可,这个.gitignore这个文件的作用如果文件后缀与文件里面的相同的话,是不会被选择提交的,而是忽略的,因为我们提交代码的时候只关心源代码。

    对于这个开源许可证,其实大同小异,我们随便选一个即可

    这个设置模板也是可以选也可以不选的,我们可以先选一个Readme文件

    当我们打开这个gitignore文件的时候,里面的后缀就是如下,它也是可以被修改,添加我们不想要的后缀

    image-20231102174222233

    2.git的安装

    我们得先检查一下git是否安装

    直接输入下面的即可

    git --version
    
    • 1

    如果弹出的是这个那么就说明已经安装了

    image-20231102174614090

    否则我们就要去下载,用如下的命令去下载

    yum install git
    
    • 1

    3.git的克隆

    我们先去将仓库给克隆下来

    image-20231102174342224

    然后再linux上

    我们输入

    git clone xxxxxxxxxxx   //xxxxx代表刚刚复制的东西
    
    • 1

    image-20231102175016924

    注意再这一步,如果要让我们输入密码的话,我们直接输入gitee的账号密码即可

    然后我们可以进入test里面去看看

    image-20231102175107763

    由于有个文件是隐藏的,所以我们使用a

    image-20231102175150445

    其中.git这是一个隐藏目录,它里面有很多东西记录着我们的行为,我们不要对他做出任何修改

    如下是将一个文件先拷贝到这个当前目录中

    image-20231102175502633

    4.git的add

    我们直接输入

    git add 路径
    
    • 1

    image-20231102175722694

    如上所示,就会将我们当前路径的所有文件全部提交到暂存区

    5.git的commit

    git commit -m "消息"
    
    • 1

    如下所示,当我们add完成以后,我们需要commit,这一步的目的是才是将文件提交到仓库中

    image-20231102175949287

    这里如果我们是新的用户的话,那么它会让你配置一个邮箱和名字。我们直接填写即可

    image-20231102180715520

    这一步主要是为了对代码进行溯源。因为我们的代码如果出错的话,需要进行溯源

    然后我们就可以进行前面的操作了

    6.git的push

    如下所示

    git push
    
    • 1

    image-20231102180904898

    在push的时候,会让我们输入gitee的手机号和密码,我们直接输入即可

    然后我们就可以看到gitee上已经成功提交了代码

    image-20231102181022985

    7.git log

    git log 
    
    • 1

    上面这条命令可以去查看我们之前的提交记录

    image-20231102181420664

    8.git status

    这个可以查找提交状态

    image-20231102181843809

    如果我们新建了一个文件,会提醒当前有一个文件并没有被托管

    image-20231102181935011

    如果我们按照它上面说的git add了

    image-20231102182137565

    那么会再次提醒git commit

    image-20231102182349064

    如果我们commit了,就会让我们使用push

    9. .gitignore

    当我们进去这个文件的时候,内部是这样的

    image-20231102182632959

    我们可以去修改它以此防止某些后缀的文件被提交

    比如我们添加这两个

    image-20231102182938160

    我们可以看到,这样的话,p和pp已经被忽略了

    image-20231102183040018

    二、Linux调试器—gdb

    1.背景

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

    比如如下的代码中

    image-20231103165543898

    image-20231103170035729

    我们如果直接编译的话,其实是release版本的

    我们可以使用这个命令来查看

    readelf -S test | grep -i debug
    
    • 1

    image-20231103170127844

    可见没有找到任何调试信息

    如果我们是dubug编译的话,加上g就可以了

    image-20231103170211742

    我们可以发现,如果是debug下的话会有debug信息的

    image-20231103170552243

    如果要被gdb调试,必须是debug形式的

    2.gdb安装、进入与退出

    我们先来安装gdb,它的安装命令为

    sudo yum -y install gdb.x86_64
    
    • 1

    我们先让代码如下所示

    image-20231103173224344

    当我们想要进入gdb的时候,我们可以直接

    gdb test
    
    • 1

    image-20231103174705332

    当我们想要退出的时候

    我们可以输入quit或者q指令来退出

    3.list/l

    这条指令的作用是显示出源代码,每次列10行

    image-20231103175041880

    如果它后面跟一个数字,那么会显示以该数字为中心的10行代码,如果后面跟一个函数,则显示该函数的代码

    image-20231103175355535

    如果我们上一条指令是list/l的话,那么我们下一次就可以不用再继续输入list/l,直接回车,就会再次弹出list/l这条指令的效果。即gdb会记住最近一次的指令

    4.r/run运行程序

    这条指令的作用是运行程序。当程序没有断点的时候,它就会直接运行到结尾,它如同vs2022中的F5

    image-20231103181155956

    如果程序有断点,则直接运行到下一个断点处(仅限刚开始)

    5. break/b 打断点

    这个指令需要在其后面加上一个数字或者一个函数名

    如果是数字的话,那么会在该行上面打上断点,如果是函数名则会在该函数开头打上断点

    image-20231103181708598

    如果是多文件的话,我们需要指定文件去打断点

    image-20231103193111445

    6.info/i b 查看断点

    我们刚刚已经打好了断点,可是现在的问题是,我们直接使用list的话,是看不到断点的

    所以我们就需要使用这条指令去查找我们当前已有的断点

    image-20231103181827797

    这个第一列表示的是断点的编号,Enb下面的这一行代表的是这个断点是否起作用

    Address代表的是该断点的地址。

    What代表的是该断点是第多少行

    7.delete/d (n)删除(第n行的)断点

    该指令的作用是如果不加n,则删除所有断点,如果加n,则删除编号为n的断点,注意必须是按照编号进行删除

    image-20231103182647299

    image-20231103182915992

    注意对于断点,如果我们使用q退出了调试,那么之前的断点都会消失

    当我们将断点打好以后,再去运行的话,那么这个程序它就会跑到断点处停止,因为这个r的操作就是一个类似于F5的操作

    image-20231103183441445

    8. n/next逐过程

    它就类似于vs2022中的F10功能一样,可以逐过程的执行

    image-20231103184059038

    当我们一直使用n调完了以后,那么如果我们继续查看断点的话,还会显示出断点的执行次数

    image-20231103184501650

    9. s/step逐语句

    这里就相当于vs2022的F11

    我们可以使用F11进入到函数内部

    image-20231103184654378

    10. p 监视

    这个指令就类似于vs2022的监视窗口,它可以监视某一个变量的值

    image-20231103185112211

    11.display 常显示

    这个指令和p的差不多,不过弥补了p的一些缺陷,那就是p它当执行下一步的时候又需要重新去调用查看了。而这个常显示是不会这样的

    image-20231103185515819

    12.undisplay (n) 取消常显示

    这个命令的作用是取消常显示

    不过要注意的是这个n它代表的是这个编号,而不是这个变量名

    image-20231103185747434

    13.until n跳到第n行

    在前面,我们会发现,我们已经陷入了一个循环了,并且不是很容易就能退出的,所以我们需要使用until n指令,直接跳转到第n行

    image-20231103190117676

    14.finish 结束当前函数

    有时候,我们会希望可以直接的结束当前的函数,我们当然可以用until,不过finish是更加方便的

    image-20231103190601346

    15.continue/c 从当前开始连续执行

    这个命令的意思是从当前开始连续进行,直到遇到下一个断点

    image-20231103191925042

    16.disable/enable breakpoints 禁用/使能断点

    当我们有一个断点不想要删除且我们暂时还不想用它的时候,我们可以将它禁用

    image-20231103192421214

    禁用以后它就看上去不存在,但是还是有这个断点的

    17.set var:修改变量的值

    如下所示,这个可以在调试环境下直接修改某个变量的值

    image-20231103193424510

    18.breaktrace(或bt):查看各级函数调用及参数

    我们将代码改为如下

    image-20231103194502555

    它就类似于栈帧一样,当我们有五层栈帧的时候,bt显示如下

    image-20231103194706109

    19.info(i) locals:查看当前栈帧局部变量的值

    如下所示,当我们处于该层栈帧的时候,可以看到当前的局部变量的值

    image-20231103194943913

    也可以使用i来代替

    image-20231103195026279

    三、gdb调试器总结

    • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
    • list/l 函数名:列出某个函数的源代码。
    • r或run:运行程序。
    • n 或 next:单条执行。
    • s或step:进入函数调用
    • break(b) 行号:在某一行设置断点
    • break 函数名:在某个函数开头设置断点
    • info break :查看断点信息。
    • finish:执行到当前函数返回,然后挺下来等待命令
    • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
    • 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
  • 相关阅读:
    sentinel加密狗使用及规则配置
    MATLAB计算各种复合干热指数,如SDHI、DHMI等
    如何优雅得关闭协程呢
    解决 net core 3.x 跨域问题
    openstack wallaby 对应 需要的python版本 3.8.18
    Python基于宽度优先搜索的程序综合-SyGus求解器
    夯实基础上篇-图解 JavaScript 执行机制
    我已经搞了三年算法面试培训了
    java实验报告2:三种结构综合案例练习
    Cartesi 2022 年 8 月回顾
  • 原文地址:https://blog.csdn.net/jhdhdhehej/article/details/134223586