Linux开发工具(git、gdb/cgdb)--详解

devtools/2024/9/22 16:27:08/

目录

  • 一、Linux 开发工具分布式版本控制软件 git
    • 1、背景
    • 2、使用 git
      • (1)预备工作——安装 git
      • (2)克隆远程仓库到本地
      • (3)把需要提交的代码拷贝到本地仓库
      • (4)提交本地仓库文件到远程仓库,三板斧(add,commit, push)
      • (6)补充
  • 二、Linux 开发工具调试器 gdb / cgdb
    • 1、安装
    • 2、背景
    • 3、基本概念
    • 4、基本操作
    • 5、cgdb

git_1">一、Linux 开发工具分布式版本控制软件 git

1、背景

git 是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于 2005 年以 GPL 许可协议发布。最初目的是为了更好地管理 Linux 内核开发而设计。

git_5">2、使用 git

git_6">(1)预备工作——安装 git

ubuntu:

$ sudo apt install -y git

centos 7:

$ sudo yum install -y git

gitee / github 创建新仓库,然后在创建好的仓库页面中复制远程仓库的地址 url,推荐 HTTPS。

(2)克隆远程仓库到本地

windows下我们的操作:
在这里插入图片描述
在这里插入图片描述
Linux下我们的操作:

$ git clone [url] # 这里的url就是刚刚建立好的仓库的链接

在这里插入图片描述

执行命令后,输入 gitee / github 的用户名和密码,将会直接在本地创建一个放置代码的目录。
仓库中的内容(注意:不要修改隐藏文件 .git 里面的内容):

在这里插入图片描述

(3)把需要提交的代码拷贝到本地仓库

(4)提交本地仓库文件到远程仓库,三板斧(add,commit, push)

  • 查看本地仓库所有文件状态
$ git status # 查看本地仓库所有文件状态

在这里插入图片描述
如上可知 test.c 没有被添加到仓库里,他建议我们用git add

  • 把文件添加到仓库中(git的暂存区——index)
$ git add test.c # 添加所有文件到暂存区(git里的index),将需要用git管理的文件告知git

要是想放弃上述操作,输入如下代码 git reset …
在这里插入图片描述

  • 不放弃上面 add操作,确认提交文件到本地仓库
$ git commit -m "添加第一个源代码 test.c"

" "中写提交日志,不能乱写,描述改动的详细内容

下图即日志:
在这里插入图片描述

在这里插入图片描述
下图中这个master 89ee7fb有什么作用呢?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 推动本地仓库的文件到远程仓库,即同步到远端服务器上
$ git push 

第一次使用 git 时候,会让你设置用户名和邮箱(每次 git 提交都会使用到该信息,它被永远的嵌入到了你的提交中)

$ git config --global user.email "you@example.com" # 邮箱
$ git config --global user.name "Your Name"        # 用户名

当依次执行上述命令后,输入 gitee/github 的用户名和密码,在 gitee/github 上的远程仓库刷新就可以看到自己的代码了。

在这里插入图片描述

(6)补充

  • 查看所有提交日志的信息
$ git log    # 查看所有提交日志信息
  • 忽略掉不想本地托管/上传的文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • git 仓库提交,本地与远端不同,会产生冲突。
    Windows 和 linux 用户可以同时使用git 。假如 windows的 别的用户提交了仓库,那你的仓库就和远端不同步,内容不同,因此linux的你需要以下指令
$ git pull

把远端拉取下来。

接着正常进行 push 就好。

问题1:

windows用户首先提交修改代码:
在这里插入图片描述

linux 用户 也想提交自己的,但首先要pull 同步远端本地
在这里插入图片描述
然后我们会发现,系统把与linux相同的部分保存不变,与linux不同的内容依次出现在文档里,需要我们手动同步
在这里插入图片描述
接着完成正常操作,就可以把代码传到远端。

在这里插入图片描述

注:更多git内容移步 git 精品课。

二、Linux 开发工具调试器 gdb / cgdb

1、安装

$ sudo apt install -y gdb

安装成功如下:

在这里插入图片描述

2、背景

程序的发布的两种模式:

  • debug 模式(在生成可执行程序的时候,会加入调试信息,可调试)。
  • release 模式(没有调试信息,不可被调试)。

3、基本概念

Linux gcc / g++ 出来的二进制程序,默认是 release 模式
要使用 gdb 调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。
在这里插入图片描述
我们用 readelf 可以读取可持续程序格式,管理信息
在这里插入图片描述
我们可以发现 debug 版本的多了调试信息,同时文件大小还比不加 debug 的大。

4、基本操作

gdb 命令格式:gdb [目标文件名]
q / quit 退出

在这里插入图片描述

这些基本操作中,常用操作都在下面举了例子,例子也是大致按照调试步骤来排列的。

  • list/l + 行号:列出行号前后五行源代码,若为前五行,则往后列够10行,若为后五行,则列出前面五行加最后几行。

在这里插入图片描述

  • list/l:显示程序源代码,从上次的位置开始,每次列出10行。

在这里插入图片描述

  • list/l + 函数名:列出指定函数的源代码。

在这里插入图片描述

  • list/l + 文件名:行号:列出指定函数的源代码。

在这里插入图片描述

  • 无命令:按回车执行最近一次命令。

在这里插入图片描述

  • b / break + 行号:在某一行设置断点。

在一个调试周期下,把 gdb 打开不退,断点号即使删了也会线性递增,就是删了断点2,他下个断点会是3,但是退出gdb重新启动,断点就没有了。

在这里插入图片描述

  • b / break + 函数名:在某个函数开头设置断点。(实际上是这个断点是打在该函数的第一行)

在这里插入图片描述

  • info / i b:查看断点信息。当前设置了哪些断点。

  • delete / d breakpoint:删除所有断点

在这里插入图片描述

  • delete / d Num:删除序号为 Num 的断点。

在这里插入图片描述

  • disable Num:禁用断点。

在这里插入图片描述

  • enable Num:启用断点。

在这里插入图片描述

  • r 或 run:开始调试,如果没有设置断点,就直接运行结束,有断点,就停下。(相当于 VS 中的 F5)

在这里插入图片描述

  • n 或 next:单条执行。(逐过程,不会进入函数,相当于 VS 中的 F10)

在这里插入图片描述

  • s 或 step:进入函数调用。(逐语句,会进入函数,相当于 VS 中的 F11)

在这里插入图片描述

  • display + 变量名:设置常显示。跟踪查看一个变量,每次停下来都显示它的值。

在这里插入图片描述

  • undisplay + 序号:取消常显示。取消对先前设置的那些变量的跟踪。

在这里插入图片描述
注意: 再次 display 时,i 的值同样是线性递增的,与断点相同。

  • print / p + 变量:打印变量值。

在这里插入图片描述

  • until X(指定行号):跳转到第 X 行。

在这里插入图片描述

  • continue / c:从当前位置开始连续而非单步执行程序。(运行至下一个断点处停下来)

在这里插入图片描述

  • finish:执行到当前函数返回,然后停下来等待命令。输入 finish 可直接结束当前函数调用,用此命令可以快速判断一个程序中到底是哪个函数出了 bug(此命令在非 main 函数中才有效)。

在这里插入图片描述

  • info / i locals:查看当前栈帧局部变量的值

在这里插入图片描述

  • bt / breaktrace:查看各级函数调用及参数(相当于 VS 中的查看调用堆栈)。

在这里插入图片描述

  • watch + 变量名:执行时监视一个表达式(如变量的值)。如果监视的表达式在程序运行期间的值发生变化,gdb会暂时暂停程序的执行,并通知使用者。

在这里插入图片描述
类似于断点,但是类型不一样,可以 info b一下:
在这里插入图片描述
发现类型是 watchpoint

  • set var i = 100:修改变量 i 的值(比如在调试过程中,有一个变量值是flag,我不小心设成了0,应该是-1,结果在Sum函数中,我想算sum*flag,导致怎么算都是0,因此可以直接改变var flag 的值先行验证)。

在这里插入图片描述

  • 条件断点1(新增):b + 行号 + if 的判断语句:当判断语句满足时,断点便触发。如:b 28 if i = 10
  • 条件断点2(已有断点):condition + 断点序号 + if 的判断语句:当判断语句满足时,断点便触发,与上述不同的是改已有的断点。

5、cgdb

(1)安装

$ sudo apt install -y cgdb

(2)好处是可以分屏
在这里插入图片描述
cgdb的命令与gdb基本相同。

我们调试过程中可以使用连招,断点 b + 逐过程n + 逐语句s定位到函数,同时可以结合display显示变量,watch监视,finish结束函数,until跳转等功能进行调试


http://www.ppmy.cn/devtools/115539.html

相关文章

从零开始学习Linux(13)---多线程

目录 1.线程 1.线程的概念 2.线程的理解(Linux系统为例)---一般系统 3.进程vs线程 4.线程的控制 5.线程的等待 6.线程的终止 7.线程的分离 2.线程的互斥 1.互斥锁 2.条件变量 3.生产消费模型 4.阻塞队列 5.信号量 6.唤醒队列 1.线程 1.线…

ChatGPT 为何将前端框架从 Next.js 更换为 Remix以及框架的选择

**老师**:大家好,今天我们来聊一下前端框架的选择与切换。最近,有个非常热门的话题:ChatGPT 官网将前端框架从 Next.js 更换为 Remix。这一举动引发了广泛关注。你们觉得这背后的原因是什么呢? **学生A**:…

【微服务】Eureka的自我保护机制

Eureka的自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮,稳定的运行。 在正常情况下,Eureka客户端会定期向Eureka服务器发送心跳,以表明它仍然存活和可用。如果Eureka服务器在配…

Vue + element-ui实现动态表单项以及动态校验规则

Vue element-ui实现动态表单项以及动态校验规则 情境 项目需要实现一个功能,表单中某个表单项产品id支持动态新增多个产品id表单项,每个产品id表单项都需要有校验规则,校验失败时各自有对应的校验提示 重点分析 表单对象内字段并非固定&…

【后端开发】JavaEE初阶—线程的理解和编程实现

前言: 🌟🌟本期讲解多线程的知识哟~~~,希望能帮到屏幕前的你。 🌈上期博客在这里:【后端开发】JavaEE初阶——计算机是如何工作的???-CSDN博客 🌈感兴趣的小伙…

【C#】 EventWaitHandle的用法

EventWaitHandle 是 C# 中用于线程间同步的一个类,它提供了对共享资源的访问控制,以及线程间的同步机制。EventWaitHandle 类位于 System.Threading 命名空间下,主要用于实现互斥访问、信号量控制等场景。 创建 EventWaitHandle 创建一个 E…

【学习笔记】STM32F407探索者HAL库开发(五)F407时钟系统配置

【学习笔记】STM32F407探索者HAL库开发(四)F407时钟系统配置 1 F407_CubeMX时钟树配置(传送门)2 STM32F407时钟树2.1 STM32F407时钟系统图2.2 STM32F103时钟树简图2.2.1 高速部分2.2.2 低速部分 2.3 时钟源2.3.1 外部时钟源2.3.2 …

C# 中的NPOI 库

NPOI 是一个开源的 .NET 库,用于读写 Microsoft Office 格式的文件,如 Excel (.xls, .xlsx), Word (.doc, .docx), PowerPoint (.ppt, .pptx) 等。它提供了一个与 Microsoft Office 文件格式兼容的 API,使得开发者可以在不依赖 Microsoft Off…