为什么调试的时候需要编译选项中添加 -g?
gcc默认生成的可执行程序时release版本
然而程序想要能够调试必须是debug 版本
生成debug版本的命令:gcc -g main.c -o main
常用操作:
1.启动 gdb :gdb加载程序信息;gdb加载程序时如果有程序运行参数,不能加载的时候给 与, 应该开始调试的时候给.
gdb ./main -> run -l -a
两种方式:
1.gdb ./execfile
2.gdb运行起来后;内部运行 file exefile
2.开始调试:
start 开始逐步调试
run 直接运行程序;若有错误直到错误处停止
3.常见操作:
list 查看代码(打印出10行)
单个文件: list codeline 多个文件:list 文件名:codeline
n:下一步 不进入函数,相当于vsF10 s:下一步跟踪进入函数,相当于vsF11
until直接运行到指定行 until file:line
4.断点相关操作
break :打断点 info 查看调试信息
break file:line (在指定出设置断点) info break 查看断点信息
break function_name(在指定函数处设置断点)
print 查看变量内容 continue 继续运行(从这一个断电运行到下一个节点,没有下一个节点直接运行完)
print value delete:删除断点
delete:删除所有断点,
delete break_id:删除指定断点
watch 变量监控,当变量内容改变时,停下来 watch value
5.查看函数调用栈信息
backtrace(bt):查看函数调用栈信息--快速定位程序崩溃位置(0号就是出错函数)
gcc常用选项
-E: 预处理
-S: 编译
-c: 汇编
-o: 指定生成文件名称
-static 静态链接
-g; 开启程序调试模式,加入调试符号信息生成debug版本
gcc -g main.c -o main
进度条程序实现:
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
int main()
{
int i =0;
char bar[101]={0};
for(i=0;i<101;i++)
{
bar[i]='0';
printf("\033[1;31;44m%s\033[0m [%d%%]\r",bar,i);
fflush(stdout);
bar[i]=' ';
usleep(100000);
}
printf("\n");
return 0;
}
运行结果:
转义序列以控制字符’ESC’开头。多数转义序列超过两个字符,故通常以’ESC’和左括号’[‘开头。该起始序列称为控制序列引导符,通常由’\033[‘或’\e[‘代替。
通过转义序列设置终端显示属性时,可采用以下格式:
\033[ Param {;Param;…}m 或 \e[ Param {;Param;…}m
显示序列:
\033[0m 关闭转义序列
\033[1m 粗体或高亮
\033[5m 闪烁
前景颜色序列:
\033[40m 黑
\033[41m 红
\033[42m 绿
\033[43m 黄
\033[44m 蓝
\033[45m 洋红
\033[46m 青
\033[47m 白