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;
}
运行结果:
这里我们观看到结果:先显示出打印结果并换行,5秒后程序运行结束。
2.打印字符串时不带 ‘\n‘
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world!");
sleep(3);
return 0;
}
运行结果:
这里输出结果为,前五秒什么都没输出,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;
}
运行结果:
运行结果为,先打印出字符串内容,然后五秒后内容清空。这里我们注意到光标在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;
}