当前位置: 首页 > news >正文

进度条+ 基础开发工具----版本控制器git 调试器gdb/cgdb

进度条

先解决下面的问题

缓冲区问题

如下图 printf的结果一个有\n一个没有\n

对于第一种没有\n的情况  发现没有打印任何内容 sleep三秒后就直接显示了命令行 

这是为什么呢? 打印的信息去哪了? 为什么第二种情况加了\n就会打印了呢?

这是因为存在缓冲区 执行到printf  要打印的内容不会直接显示在显示器上

只有当缓冲区刷新的时候 才会把缓冲区的内容显示在显示器上

而\n就可以起到刷新缓冲区的作用  如果没有\n 只有在return 0程序结束后 此时缓冲区自动刷新

那么如果不想用\n  想要直接刷新缓冲区来打印内容呢?

fflush(stdout)  此时就会刷新c的标准输出缓冲区

stdout(标准输出) stdin(标准输入) stderr(标准错误 )都是c的标准输入输出通道

之前在c语言学过的的fprintf第一个参数就是选择文件流指针 

printf("hello ")底层其实就是fprintf("stdout","hello")

倒计时程序

要注意下面两点

① 打印一个字符会 要让光标会到起始位置

② 打印一个字符之后要手动刷新缓冲区 让打印的数字直接显示出来

对于第②点用上面提到的fflush函数来解决 而对于第①点用到\r (\r不会刷新缓冲区)

此时初步完成了 但是这是一位数的情况 如果是两位呢?

就有了下面的问题

此时需要控制printf输出的格式来解决

此时一个简单的倒计时的程序就写好了 接下来开始进度条的实现

进度条初版

我们期望的形式如下 第一个[]里面是进度的表示  一共有100个空格 进度每增1就用一个字符-来填充  第二个[]里面显示进度的百分比形式 第三个[]来显示旋转光圈

[-------------------------.......][ ][ ]

然后再搞一个旋转光圈放到第三个[]里面 也就是我们等待时候常见的在屏幕中间转圈圈的东西 这里就简单的实现 

初版就完成了  这一版只是简单表示了出来   但是如果要和真正的应用结合起来呢 如下载一个东西 下载的进度和进度条同步

第二版

如下为编译后生成的process程序运行的结果 

版本控制器Git

git的来源 作用这些就不提了

git的安装

和之前软件安装的方式一模一样

sudo yum install -y git     CentOS

sudo apt install -y git       Ubuntu

git version 查看安装的git版本信息

把代码提交到远端仓库的过程

①首先需要在远端创建一个仓库(也可以在本地 推荐直接在远端创建) 

在注册了gitee账号后 右上角新建仓库 输入个仓库名称

②需要先把远端的仓库给克隆到本地 

复制仓库链接后  直接在命令行中输入git clone 仓库链接     就会把远端仓库克隆到本地当前目录下

③把本地的代码先放到拷过来的仓库里面

需要先push add放到缓冲区 然后push commit -m "" 把缓冲区的内容放到拷过来的本地仓库里面

git status 可以查看当前仓库的状态信息  它会显示工作目录和暂存区的变更情况   帮助你了解哪些文件被修改 新增或删除  以及哪些变更已经暂存准备提交。

④然后再把拷贝的仓库push给远端仓库

git push 就会直接把克隆仓库的内容push给远端的仓库

会提示需要输入账户名及密码

提交后 如果没有小绿点是因为还没有绑定邮箱

git config --global user.email "your_email" 可以绑定自己的邮箱 但需要与gitee账号绑定的邮箱相同

git log  可以查看历史上每次提交的作者日期 及提交时写的信息等

补充

一次要提交当前目录所有的内容可以直接 git add.  把所有内容都放到缓冲区中

如果并没有提前克隆仓库到本地(要提交到远端的内容不在当前当前克隆到本地的仓库中)  可以后克隆仓库  然后把要提交到远端的内容拷贝到当前的克隆仓库里面  再进行上面的操作

另外还有一个问题 可能远端的仓库和当前的本地克隆仓库不同步 此时提交会出问题

一般是多人协作会出这样的问题 但是自己也可能这样 如先在linux下克隆了个仓库到了linux某目录下 此时在windows下又提交了些内容到远端仓库 此时linux下当前仓库和远端仓库就是不同步的 此时提交就会出问题

git fetch origin  获取远端仓库的最新更改  但不会自动合并到你的本地分支

 git pull origin master/main(取决于自己的分支)   获取远端仓库的更改并合并到你的当前分支

调试器 gdb/cgdb

debug和release模式

dubug 模式

目的 用于开发和调试阶段,帮助开发者识别和修复代码中的错误。

 Release 模式

目的 用于最终发布和上线的版本  会极致优化应用程序的性能和大小 该模式下不能调试

使用方式  gdb/cgdb  可执行程序       退出方式   CTRL+d 或者输入quit退出

使用时 后面的必须是可执行程序 且必须是debug模式下gcc默认编译的是release的情况

可以用过编译的时候再后面加 -g来指定生成的是debug模式 此时才可以用gdb/cdgb调试

cgdb和gdb的指令是一样的 

区别如下   cgdb会在上面显示出代码 下面为指令调试区  而gbd不能看到代码只能看到下面的指令调试区  

如果想看代码可以用list指令

list或者简写l  打印从第一行开始的10行代码 再次输入继续打印接下来的十行

list 1会重新打印从第一行开始的十行代码 

gdb使用起来不便  所以接下来使用cgdb   

在cgdb中   ESC 会切换到代码屏 此时上下键可以移动观察代码    i回到调试区

break/b   info b

break简写b +行号或者函数名   在对应的行号打断点  

info b 显示断点信息

delete/d

delete简写d+断点的编号 (不是行号 )     删除断点

run/r continue/c

run简写r    如果没有断点 会从程序开始一直执行直到程序结束 如果中间有断点 会从开始运行到第一个断点处     再次r会问是否从开始重新执行

r每次都是从程序开始执行的 如果有多个断点每次只能从开始到第一个断点就结束 

coutinue简写c   可以从当前位置开始执行到结束同样遇到断点停止

如下 在14行和18行有两个断点 如果从14行开始 此时r会询问是否确认重新从头开始 y的话之后会从头开始然后再次到14行停止 而c会从14行开始运行到下一行断点18行停止

next/n  step/s

在vs中F10是逐过程 F11是逐语句

在这里next简写n就是逐过程    step简写s就是逐语句

例如 在下面17行打了断点  先r  到了17行 此时输入s就会进入到sum函数当中

而如果到了17行 此时用n 会直接执行完当前行然后跳转到下一行

bt

bt 查看当前调用栈帧   在函数递归观察起来很方便

finish

finish  让当前函数执行完毕并返回到调用处  同时显示返回值

如下本来在sum函数中  此时n或者s只会一行一行的执行  finish会直接结束sum函数返回到调用其的地方 并显示出返回值

如上  在返回到main函数调用的地方后 发现还在17行 是因为刚刚finish结束的只是sum函数 它的返回值还没有给了变量n   

通过p指令可以观察到

p

p+变量 打印变量值 

如下 finish结束sum函数后 此时的变量n是0 在用指令n执行当前语句后 此时的n就变成了5050 

断点的使能与禁用

如下 通过info查看断点的时候 Enb的信息如果是y就代表该断点使能 如果是n 就代表该断点禁用

为什么要禁用断点? 为什么不直接删除断点?

可能在代码中设置了多个断点  这些断点的位置和条件可能经过精心配置 通过使能/禁用  可以保留断点的所有配置  只需简单切换状态即可

disable    

disable+断点编号  禁用断点

如下 把1号断点禁用了 此时1号断点的Enb变为了n  并且断点的行号14行变成了黄色

此时r运行会忽略14行的断点 直接运行到十五行

enable

enable +断点编号 恢复断点的使能

调试的本质是为了找到问题  而断点是为了把代码分块  是调试的一种技巧 为了更快找到里面的问题

如下 如果想确认sum函数是否有问题 可以用finish来直接结束该函数给出返回值来看其是否有问题 

也可以通过until来对局部的内进行快速的确认

until

until +行号 直接运行到当前行号

如下 在sum函数的第二行开始 until 9就会一直执行到第九行为止

如果在调试的过程中我们想监视某变量的值呢 就像之前vs中的监视窗口一样 在调试代码的时候 通过监视窗口能实时观察到变量值的变化  上面提到的p+变量 的方式只能当前看到 但是继续输入命令 就看不到了

display  undisplay

display+变量名  跟踪指定变量的值

如下 在把result s e i这四个变量都用display后 在之后的每次调试中  这四个变量的值都会显示出来

undisplay+编号  取消对某个变量的跟踪

info local

info local 自动显示出当前函数局部变量的值

常见技巧

watch

watch  变量名 监视⼀个表达式(如变量)的值  如果监视的表达式在程序运行期间的值发生变化 会暂停程序的执行

如果我们有⼀些变量不应该修改 但是我们怀疑它修改导致了问题   此时可以watch它  如果它改变了 程序就会立刻停止 并且显示出它的旧值及新值 我们就马上指定确实是它的问题

set var   

确定问题原因

如果在调试的过程中我们发现了错误的原因是一个变量值的问题 那我们需要把这个变量值给修改掉 但是如果退出程序在编辑器中进行修改再重新调试很麻烦

set var 变量名 修改后的值   就可以把这个变量值在调试期间修改为对应的值 方便继续进行调试 

条件断点

b 行数  if 条件

如下在第七行 打了一个条件断点   此时r 只有当i==10并且到了第7行才会停下

和正常断点的显示及删除都相同

也可以对已有的断点新增条件

condition 断点编号 新增条件

gdb会自动记录最近一次输入的命令 此时回车键就会指向最近一次的命令

http://www.dtcms.com/a/585791.html

相关文章:

  • 我在高职教STM32(新11)——LCD1602显示效果控制
  • 将 AI 注入终端:Gemini CLI 保姆级安装与实战指南
  • 珠海市住房城乡建设局网站衡阳网站建设公司哪家好
  • leetcode 345. 反转字符串中的元音字母 python
  • 创建一个网站 站点根文件夹为wordpress互动
  • 网站建设账务处理属于什么费用瑞安这边有没有做网站的
  • S14排序算法--基数排序
  • 人工智能之数学基础:连续型随机变量的期望
  • 江苏省住房和城乡建设厅网站首页东莞微联建站
  • SVG 简介
  • PostgreSQL 高可用实战:流复制主从集群(0 数据丢失 + 故障无缝切换)
  • antd Form表单实践模板(Form.useForm)
  • 数据结构与算法概述
  • n8n + Pinecone + ModelScope:知识库向量查询工作流实战
  • C++ 面向对象三大特性之一---多态
  • 合肥企业网站建设网站图片怎样做seo优化
  • 短剧小程序 2025 核心痛点分析:内容、技术与合规的三重困境
  • 河南省住房和城乡建设厅网站查证网站前台右侧怎么做二维码
  • 从原理到实操:ddraw.dll是什么?为何游戏启动时频繁提示“找不到ddraw.dll”?解决思路全解析
  • 计算机网络自顶向下方法39——网络层 中间盒 互联网架构原则(IP沙漏 端到端原则)
  • 广州有做虚拟货币网站视频创作用什么软件
  • wap网站和app开发正邦集团招聘
  • RV1126 NO.43:OPENCV形态学基础之二:腐蚀
  • 算法学习 24 使用集合解决问题
  • Java基础——集合进阶3
  • Ascend C 编程模型揭秘:深入理解核函数与任务并行机制
  • 算法题——002
  • 佛山微信网站开发易语言网站开发教程
  • 从零搭建PyTorch计算机视觉模型
  • 培训课程网站建设淮阳 网站建设