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

目录

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

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

1、背景

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

2、使用 git

(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.xdnf.cn/news/1541856.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一种新的电子邮件攻击方式:AiTM

新的攻击组利用合作伙伴组织之间的信任关系来绕过多重身份验证。 一种新的攻击方式开始出现,它利用合作伙伴组织之间的信任关系绕过多重身份验证。在一个利用不同组织之间关系的攻击中,攻击者成功地对四家或更多组织进行了商业电子邮件欺诈(BEC)攻击&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击,shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

计算机毕业设计推荐-基于python大数据的个性化图书数据可视化分析

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、个性化图书数据可视化分析-项…

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表)

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表) 题目描述 给定一个有向图,图中包含 n 个节点,节点编号从 0 到 n - 1。每个节点都有一个出边,指向图中的另一个节点。图由一个长度为 n 的整数数组 edges 表示…

【Linux学习】基本指令其一

命令行界面 命令行终端是一个用户界面,允许用户通过输入文本命令与计算机系统进行交互。 比如Windows下, 键入winR,然后输入cmd,就可以输入文本指令与操作系统交互了。 Windows有另一个命令行界面Powershell,它的功能比cmd更强大…

江协科技STM32学习- P15 TIM输出比较

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示 【开源】LVGLFreeRTOS 基于STM32F411的智能健康助手小项目 网盘链接在最底下!!!无套路!!!直接分享!!! 硬件介绍 STM32F411CEU6 主控 TFT 1.8inch 显示屏 DTH…

WebGL缓冲区

一、缓冲区对象 缓冲区对象时WebGL系统中的一块内存区域,可以一次性地向缓冲区对象中填充大量的顶点数据,然后将这些数据保存其中,供顶点着色器使用。 类型化数组 这样程序可以预知数组中的类型,提高性能 类型描述Int8Array8位…

数据湖 Data Lake-概述

Data Lake 1. 数据湖的定义 数据湖是一种存储系统,用于集中存储大量的原始数据,可以按数据本来的原始格式进行存储,用户可以在需要时提取和分析这些数据。 A data lake is a centralized repository designed to hold vast volumes of data …

JavaScript高级进阶(三)

DOM-改变HTML 语法与说明 document.write() //改变HTML输出流,整个页面进行重绘。 操作对象.innerHTML新的HTML //改变HTML内容 操作对象.attribute新属性值 //改变HTML属性 对象.style.property新样式 //改变操作样式的属性 注意: document.write(),优先级太高&am…

Th:1.1 建立连接

基础讲解 1.TCP通信流程 基于TCP通信的Socket基本流程: 1.1 Socket 函数返回值&#xff1a;一个文件描述符&#xff1a; 特别的两个队列。 #include <sys/types.h> #include <sys/socket.h> //create an endpoint for communication int socket(int …

vue循环渲染动态展示内容案例(“更多”按钮功能)

当我们在网页浏览时&#xff0c;常常会有以下情况&#xff1a;要展示的内容太多&#xff0c;但展示空间有限&#xff0c;比如我们要在页面的一部分空间中展示较多的内容放不下&#xff0c;通常会有两种解决方式&#xff1a;分页&#xff0c;“更多”按钮。 今天我们的案例用于…

MyBatis-config.xml核心配置

MyBatis-config.xml 包含了会深深影响MyBatis行为的设置和属性信息&#xff0c;配置文档的顶层结构如下 environments&#xff08;环境配置&#xff09; environments用于配置数据库的URL信息&#xff0c;MyBatis-config可以动态配置多个数据源&#xff0c;用于连生产、预发、…

python:编写一个函数查找字符串中的最长公共前缀

最近在csdn网站上刷到一个题目&#xff0c;题目要求编写一个函数查找字符串中的最长公共前缀&#xff0c;题目如下&#xff1a; 给出的答案如下&#xff1a; from typing import List def longestCommonPrefix(strs:List[str]) -> str:if len(strs) 0:return i 0 #代…

矩阵系统源码搭建抖音矩阵批量剪辑矩阵分发,矩阵系统可开源或oem

揭秘抖音矩阵系统源码搭建秘籍 在短视频平台迅猛增长的背景下&#xff0c;抖音矩阵系统已变成扩大创作者及企业影响力的有效工具。构建这样一个系统需要精通多种编程技术&#xff0c;本文将探讨这些关键技术点。 矩阵营销系统通过集成多项功能如跨平台的账户管理、自动化任务生…

AI周报(9.15-9.21)

AI应用-宇宙建筑师&#xff1a;AI探索宇宙结构 近日&#xff0c;来自马克斯普朗克研究所等机构&#xff0c;利用宇宙学和红移依赖性对宇宙结构形成进行了场级仿真。 AI版“宇宙闪电侠”&#xff1a;若以传统宇宙模拟的缓慢行进比作悠然自得的蜗牛&#xff0c;那么AI便宛如宇宙…

Observability:构建下一代托管接入服务

作者&#xff1a;来自 Elastic Vishal Raj, Marc Lopez Rubio 随着无服务器&#xff08;serverless&#xff09;的引入&#xff0c;向 Elastic Cloud 发送可观察性数据变得越来越容易。你可以在 Elastic Cloud Serverless 中创建一个可观察性无服务器项目&#xff0c;并将可观察…

LeetCode 每周算法 7(二分查找)

LeetCode 每周算法 7&#xff08;二分查找&#xff09; 二分查找算法&#xff1a; class Solution { public: // 定义一个函数&#xff0c;接收一个整数向量nums和一个整数target&#xff0c;返回目标值在数组中的插入位置 int searchInsert(vector<int>& nums,…

golang学习笔记4-基本数据类型

声明&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点&#xff0c;方便自己回顾。 go的数据类型如下 由于bool和c类似&#xff0c;和go的区别是&#xff0c;bool的值只能取true和false&#xff0c;不能取整数&#xff0c;而且有默认值false。 一…