Linux調試器-gdb使用 && Linux彩色進度條實現

Linux調試器-gdb使用

1.背景小程序

  • 程序的發佈方式有兩種,debug模式和release模式
  • Linux gcc/g++編譯出來的二進制程序,默認是release模式
  • 要使用gdb調試,必須在源代碼生成二進制程序的時候加上 -g 選項

2.開始使用ide

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'ui

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

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

運行結果:
Linux調試器-gdb使用 && Linux彩色進度條實現
這裏咱們觀看到結果:先顯示出打印結果並換行,5秒後程序運行結束。debug

2.打印字符串時不帶 '\n'調試

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

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

運行結果:
Linux調試器-gdb使用 && Linux彩色進度條實現
這裏輸出結果爲,前五秒什麼都沒輸出,5秒後打印出字符串內容,可是不曾換行。code

3.打印字符串時帶 '\n' && fflush刷新緩衝區blog

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

運行結果同第二個,可是現象爲,先打印字符串內容,五秒後程序退出,而且也沒有換行。字符串

4.打印字符串時帶 '\r'string

#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;
}
相關文章
相關標籤/搜索