【Linux】gdb / cgdb 调试 + 进度条

news/2024/12/2 21:48:49/

🌻个人主页:路飞雪吖~

       🌠专栏:Linux


目录

 

一、Linux调试器-gdb

🌟开始使用

🌠小贴士:

🌟gdb指令

🌠小贴士:

 ✨watch 监视

✨打条件断点

 

二、小程序----进度条

🌠知识储备:


一、Linux调试器-gdb

🌟开始使用

🌠小贴士:

1、要用gdb来进行调试,前提条件是代码必须是debug发布的。

(debug:添加调试信息; release:取消调试信息)

2、gcc/g++ 编译程序时,默认它采用的发布模式是release。

3、要使我们的程序用debug来发布,需要我们在编译时加上 -g 。

语法: gdb  [可执行程序]

退出: quit  / ctrl+d

🌟gdb指令

🌠小贴士:

• gdb会记录最新的一条命令,直接回车就是默认执行该命令;

指令功能
list / l 行号

显示可执行程序的源代码,

默认查看的代码行号处于展现代码的中间部分,共展现10行 

list / l 函数名列出某个函数的源代码
r或run运行程序(F5)
break(b) 行号在某一行设置断点

break 函数名

在某个函数开头设置断点
info break查看断点信息
d  断点编号删除断点
disable breakpoints禁用断点
enable breakpoints启用断点
n 或 next (F10)代码从断点处,单条执行(逐过程),不进入函数内部
s或step (F11)进入函数调用
display [要查看的内容]常显示具体信息(循环中 i 的值,地址.....)
undisplay [对应的编号]去掉显示的内容

p [变量]

p [表达式]

打印指定变量的值
until [次数]跳转到当前函数的内部的任意一行处

给指定文件打断点  ---> b [文件名]:行号/函数名

在我们一个调试周期下,断点的编号时递增的。

断点禁用:

断点被使用:

n 逐过程:不进入函数里面

进入函数内部后,查看详细的信息:

查看相关内容:

指定循环次数:

从上面就可以看出,gdb的调试,不方便查看代码,为此我们来介绍一个工具:

🌠小贴士:

在终端下/命令行中进行调试的工具

工具: cgdb  让代码进行可视化

安装: sudo yum install -y cgdb

使用: cgdb [可执行程序] 

调试的本质----找到问题---> 解决bug

快速定位问题:

断点 + finish + until + continue : 对大的代码块进行区间debug

指令功能
continue / c从一个断点,直接运行到下一个断点
finish把现在所处函数的代码跑完(以函数级别进行运行)
info locals显示临时变量的信息
set var 变量=值

修改变量的值  (set var i = 10)

可以让我们在发现问题时,当场改变值来验证答案(预修订),再出去修正代码。

b 行号/文件名 if i==30

condition 2 i==30

打条件断点

1、新增

2、给已有断点追加

 ✨watch 监视

即专门针对某个变量的断点。

打条件断点

1、新增断点

2、给已有断点追加:

二、小程序----进度条

🌠知识储备:

<1> 回车和换行

回车(\r):本质是让光标回归到当前行的最开始。

换行(\n):直接从当前行跳转到下一行,光标在上一行对下来的位置

在平时我们都会以为这两个使用是一样的,其实不然,新起一行的本质:先回车,再换行

<2> 缓冲区

虽然程序是在两秒之后才打印出来“hello Linux!!!”,但是文件是先执行printf,再执行sleep,原因是什么呢?

在程序执行sleep 2秒期间,“hello Linux!!!”字符串在哪里?

它会保存在,由C语言提供的输出缓冲区中。

<3> 有趣的小程序

当 \n 换成 \r 会有什么效果?

如何输出内容?

强制缓冲区的内容输出

当我们倒计时从 10 开始时,就会出现一点问题,这是为什么呢?

我们思考一下,我们给显示器输出的是一个整数1234,还是打印了一个1 2 3 4 字符,让我们以为打印的是一个整数,我们需要知道的是,显示器是没有类型的概念的!!!显示器只认识一个一个的字符,类型只有语言上有,其实 “ printf("%d\n",a) ” 就是把整数1234,(格式化输出)转化为“1” “2” “3” “4” 依次显示出来。

所以为什么上面程序为什么会多出一个 “0” ,也就能理解了,以为从 10 开始我们输出的是 “1” “0” ,紧接着要输出 “9” 时,光标回车到了最开始,只覆盖住了 “1” ,“0” 一直都在,所以我们需要修改输出的格式 printf("%-2d\n",countt) ;

正片开始!! 进度条~

先创建所需的文件:(模拟实现进度条的效果)

   //process.c#include "process.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <string.h>#define NUM 101
#define STYLE '='// version 1
void Process(){const char *lable = "|/-\\";int len = strlen(lable);char bar[NUM];memset(bar,'\0',sizeof(bar));int cnt=0;while(cnt <= 100){    printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%len]);fflush(stdout);                             bar[cnt] = STYLE;cnt++;                                if(cnt == NUM)               {                 bar[cnt-1] = '\0';          break;}bar[cnt] = '>';//sleep(1);usleep(50000);}printf("\r\n");}

 效果图:

加强进度条模拟下载(回调):

如若对你有帮助,记得关注、收藏、点赞哦!您的支持使我最大的动力🌹🌹🌹🌹!!!

若有误,望各位,在评论区留言或者私信我 指点迷津!!!谢谢^ ^ ~


http://www.ppmy.cn/news/1551852.html

相关文章

JVM知识点学习-2

GC介绍之引用计数法 GC之复制算法 GC之标记压缩清除算法 标记清除算法 标记清除压缩算法&#xff1a; 优化方案&#xff1a;先标记清除几次在执行压缩过程 GC总结和鸡汤

创建一个控制台应用程序,使用嵌套for语句实现1!+2!+…+10!的和.

创建一个控制台应用程序&#xff0c;使用嵌套for语句实现1&#xff01;2&#xff01;…10&#xff01;的和. static void Main(string[] args) { //定义4个int类型的变量&#xff0c;其中i表示要进行阶乘运算的数字&#xff0c;j表示对i进行阶乘运算时需要用到的数字&#x…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)

相信实验一大家已经完成了&#xff0c;对Arcgis已进一步熟悉了&#xff0c;现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…

医疗知识图谱的问答系统详解

一、项目介绍 该项目的数据来自垂直类医疗网站寻医问药&#xff0c;使用爬虫脚本data_spider.py&#xff0c;以结构化数据为主&#xff0c;构建了以疾病为中心的医疗知识图谱&#xff0c;实体规模4.4万&#xff0c;实体关系规模30万。schema的设计根据所采集的结构化数据生成&…

使用CLIP大模型实现视频定位:从理论到实践

使用CLIP大模型实现视频定位:从理论到实践 引言 随着多媒体内容的爆炸式增长,如何高效地从海量视频中定位和检索特定内容成为了一个重要的研究课题。传统的视频检索方法通常依赖于人工标注的元数据或基于视觉特征的匹配,这些方法在处理大规模数据时存在效率低下、准确率不…

农业强国助农平台:科技赋能,助力乡村振兴

在数字化转型的大潮中&#xff0c;农业作为国民经济的基础产业&#xff0c;也在积极探索着属于自己的数字化转型之路。2025年&#xff0c;随着“农业强国助农平台”的正式上线运营&#xff0c;一场以科技为驱动的助农行动正在全国范围内如火如荼地展开。这一平台由财政部“农业…

qml项目创建的区别

在Qt框架中&#xff0c;你可以使用不同的模板来创建应用程序。你提到的这几个项目类型主要针对的是Qt的不同模块和用户界面技术。下面我将分别解释这些项目类型的区别&#xff1a; 根据你提供的信息&#xff0c;以下是每个项目模板的详细描述和适用场景&#xff1a; Qt Widgets…

解锁软件构建的艺术:六种架构模式的解析

一、概述 软件架构是构建软件系统的核心&#xff0c;它规定了系统的组织结构、组件行为以及组件间的交互方式。正确选择架构对系统的性能、可维护性和可扩展性至关重要。 二、架构类型详解与技术选型 1.分层架构&#xff08;Layered Architecture&#xff09; 场景示例&#…