Linux调试器-gdb使用 && Linux彩色进度条实现

Linux调试器-gdb使用

1.背景

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++编译出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候加上 -g 选项

2.开始使用

gdb 二进制文件 退出:ctrl+d 或 quit

调试命令:

  • list 行号 :显示 二进制文件 源代码,接着上次的位置往下列,每次列10行
  • list 函数名 :列出每个函数的源代码
  • r或run :运行程序
  • n或next :单条运行
  • s或step :进入函数调用
  • break 或 b 行号 :在某一行设置断点
  • break 函数名 : 在某个函数开头设置断点
  • info break :查看断点信息
  • finish :执行到当前函数返回,然后停下来等待命令
  • printf 或 p :打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量 :打印变量值
  • set var :修改变量的值
  • continue 或 c :从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点 info(或i)
  • breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

Linux第一个小程序进度条

辨析\r&&\n

  • [ ] 我们先来观看现象

1.打印字符串时带 '\n'

#include <stdio.h>
#include <unistd.h> 

int main()
{
    printf("hello world!\n");
    sleep(3);
    return 0;
}

运行结果:
Linux调试器-gdb使用 && Linux彩色进度条实现
这里我们观看到结果:先显示出打印结果并换行,5秒后程序运行结束。

2.打印字符串时不带 '\n'

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello world!");
    sleep(3);
    return 0;
}

运行结果:
Linux调试器-gdb使用 && Linux彩色进度条实现
这里输出结果为,前五秒什么都没输出,5秒后打印出字符串内容,但是未曾换行。

3.打印字符串时带 '\n' && fflush刷新缓冲区

#include <stdio.h>
#include <unistd.h>
int main()
{
    printf("hello Makefile!");
    fflush(stdout);
    sleep(3);
    return 0;
}

运行结果同第二个,但是现象为,先打印字符串内容,五秒后程序退出,并且也没有换行。

4.打印字符串时带 '\r'

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello chuizi!\r");      
    sleep(3);
    return 0;
}

运行结果为,未打印出字符串内容,五秒后程序退出,仍未显示出字符串的内容。此处不方便演示,读者可自行验证。

5.打印字符串时带 '\r' && fflush刷新缓冲区

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello chuizi!\r");
    fflush(stdout);           
    sleep(3);
    return 0;
}

运行结果:
Linux调试器-gdb使用 && Linux彩色进度条实现
运行结果为,先打印出字符串内容,然后五秒后内容清空。这里我们注意到光标在h位置,那么从这可以看出:/r是只回车(让光标回到这一行的初始位置),/n是回车加换行。

Linux彩色进度条实现

#include <stdio.h>                                                         
#include <unistd.h>
#include <string.h>

int main()
{
    int i = 0;
    char bar[102];
    memset(bar,'\0',sizeof(bar));
    const char*lable = "|/-\\";
    int j=0;
    int color[]={1,2,3,4,5,6,7};
    for(; i <= 100; i++)
    {
      bar[i] = '*';
      printf("\033[3%dm[%-101s]\033[0m\033[33m[%d%%]\033[0m[%c]\r", color[j],bar,i,lable[i%4]);
      fflush(stdout);
      if(i%15 == 0){
        ++j;
      }
      usleep(100000);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.51cto.com/14289099/2546160