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

🌻个人主页:路飞雪吖~

🌠专栏:Linux


目录

一、Linux调试器-gdb

🌟开始使用

🌠小贴士:

🌟gdb指令

🌠小贴士:

[✨watch 监视](#✨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");
 }

效果图:

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

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

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

相关推荐
远游客071325 分钟前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<26 分钟前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟27 分钟前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
拭心1 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
cominglately3 小时前
centos单机部署seata
linux·运维·centos
魏 无羡3 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
带电的小王3 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
CircleMouse3 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
梦想平凡4 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle