🌻个人主页:路飞雪吖~
🌠专栏:Linux
目录
[✨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");
}
效果图:
加强进度条模拟下载(回调):
如若对你有帮助,记得关注、收藏、点赞哦!您的支持使我最大的动力🌹🌹🌹🌹!!!
若有误,望各位,在评论区留言或者私信我 指点迷津!!!谢谢^ ^ ~