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跳转等功能进行调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/881530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于协同过滤+SpringBoot+Vue的剧本杀服务平台系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤JavaSpringBootV…

Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案

GB28181协议凭借其在安防流媒体行业独有的大统一地位,目前已经在各种安防项目上使用。雪亮工程、幼儿园监控、智慧工地、物流监控等等项目上目前都需要接入安防摄像头或平台进行直播、回放。而GB28181协议作为国家推荐标准,目前基本所有厂家的安防摄像头…

【数据结构-二维差分】力扣2536. 子矩阵元素加 1

给你一个正整数 n ,表示最初有一个 n x n 、下标从 0 开始的整数矩阵 mat ,矩阵中填满了 0 。 另给你一个二维整数数组 query 。针对每个查询 query[i] [row1i, col1i, row2i, col2i] ,请你执行下述操作: 找出 左上角 为 (row1…

Qt圆角窗口

Qt圆角窗口 问题:自己重写了一个窗口,发现用qss设置圆角了,但是都不生效,不过子窗口圆角都生效了。 无边框移动窗口 bool eventFilter(QObject *watched, QEvent *evt) {static QPoint mousePoint;static bool mousePressed f…

灵当CRM系统index.php存在SQL注入漏洞

文章目录 免责申明漏洞描述搜索语法漏洞复现nuclei修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 灵当CRM系统是一款功能全面、易于使用的客户关系管理(C…

在Linux中运行flask项目

准备 这里我准备了一个GitHub上某个大佬写的留言板的Flask项目,就用这个来给大家做示范了。 查看留言板的目录结构 查看主程序所用的库函数 只有一个第三方库 Flask 安装pip sudo apt install python3-pip -y测试 pip 安装成功 修改pip镜像源 修改pip的默认下载…

表格标记<table>

一.表格标记、 1table&#xff1a;表格标记 2.caption:表单标题标记 3.tr:表格行标记 4.td:表格中数据单元格标记 5.th:标题单元格 table标记是表格中最外层标记&#xff0c;tr表示表格中的行标记&#xff0c;一对<tr>表示表格中的一行&#xff0c;在<tr>中可…

嵌入式 开发技巧和经验分享

文章目录 前言嵌入式 开发技巧和经验分享目录1.1嵌入式 系统的 定义1.2 嵌入式 操作系统的介绍1.3 嵌入式 开发环境1.4 编译工具链和优化1.5 嵌入式系统软件开发1.6 嵌入式SDK开发2.1选择移植的系统-FreeRtos2.2FreeRtos 移植步骤2.3 系统移植之中断处理2.4系统移植之内存管理2…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(二)-索引

场景 首先介绍测试的场景&#xff0c;本文schema定义 pdm文档索引&#xff0c;包括nested&#xff0c;扩展字段&#xff0c;文档属性扩展&#xff0c;其中_content字段是组件保留字段&#xff0c;支持文本内容 索引 索引服务索引的操作&#xff0c;包括构建&#xff0c;put …

缓存数据和数据库数据一致性问题

根据以上的流程没有问题&#xff0c;但是当数据变更的时候&#xff0c;如何把缓存变到最新&#xff0c;使我们下面要讨论的问题 1. 更新数据库再更新缓存 场景&#xff1a;数据库更新成功&#xff0c;但缓存更新失败。 问题&#xff1a; 当缓存失效或过期时&#xff0c;读取…

C++——string的了解和使用

目录 引言 为什么要学习string 1.C语言中的字符串 2.C中的字符串 auto和范围for 1.auto 1.1 auto的介绍 1.2 注意事项 2.范围for 标准库中的string类 1.string类的迭代器 1.1 begin()与end()函数 1.2 rbegin()与rend()函数 2.string类的初始化和销毁 3.string类…

企业内网安全

企业内网安全 1.安全域2.终端安全3.网络安全网络入侵检测系统异常访问检测系统隐蔽信道检测系统 4.服务器安全基础安全配置入侵防护检测 5.重点应用安全活动目录邮件系统VPN堡垒机 6.蜜罐体系建设蜜域名蜜网站蜜端口蜜服务蜜库蜜表蜜文件全民皆兵 1.安全域 企业出于不同安全防…

【ArcGISProSDK】初识

简介 ArcGIS Pro SDK 提供四种主要的可扩展性模式&#xff1a;加载项、托管配置、插件数据源和 CoreHost 应用程序。 加载项 加载项是使用 .NET 以及 Esri 的桌面应用程序标记语言 &#xff08;DAML&#xff09; &#xff08;一种由 Esri 创建的 XML 语言&#xff09;创作的…

本地不能訪問linux的kafka服務

1.本地使用kafka客戶端工具連接kafka服務&#xff0c;提示連接失敗 2. 本地使用telnet ip port命令也失敗 3.查看zookeeper和kafka服務是否正常 ps -ef | grep zookeeper ps -ef | grep kafka 3.關閉操作系統的防火墻(僅限于測試使用) 3.1.禁用防火墙 systemctl stop firew…

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…

Qt 菜单栏、工具栏、状态栏、标签、铆接部件(浮动窗口) 设置窗口核心部件(文本编辑控件)的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton> #include<QStatusBar> #include<QLabel> #include<QDockWidget> #include<QTextEdi…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

低代码门户技术:构建高效应用的全新方式

什么是低代码门户技术&#xff1f; 低代码门户技术是一种利用低代码平台构建企业门户网站或应用的技术。门户通常是企业内部和外部用户访问信息和应用的集中平台。低代码门户技术通过图形化界面和预置组件&#xff0c;允许用户快速搭建和定制这些门户平台&#xff0c;而无需深…

HTTPS:构建安全通信的基石

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff0c;作为互联网上安全通信的基石&#xff0c;通过在HTTP基础上引入SSL/TLS协议层&#xff0c;实现了数据传输的加密&#xff0c;确保了信息的机密性、完整性和真实性。这一过程涉及多个精细设计的步骤…

初始网络编程(下)

所属专栏&#xff1a;Java学习 1. TCP 的简单示例 同时&#xff0c;由于 TCP 是面向字节流的传输&#xff0c;所以说传输的基本单位是字节&#xff0c;接受发送都是使用的字节流 方法签名 方法说明 Socket accept() 开始监听指定端口&#xff08;创建时绑定的端口&…