在学习调试之前我先介绍一个程序学习一下
前置知识点:1、C语言中的\n其实默认是\r\n(\r是回到当前行的行首)
2、显示器输出数据是行刷新的,只有到下一行时才会刷新缓冲区。若程序结束,会自动刷新缓冲区

如上述进度条代码就是知识点的体现
下面我们再将此进度条应用到某一场景(如下载)

上述代码未实现下载速度会出现波动的情况,大家可以自己实现一下
调试工具
gdb 文件名就可以调试代码了,但是此时是命令行互动窗口,我们会很蒙(感觉面对的是黑箱子)。因此推荐使用cgdb,它会让文件代码再开一个分屏,让我们可以看着代码调试,只是我们还不是图形化,我们从VS的鼠标操作变为指令操作
由于gcc/g++默认编译的是release版本,我们用gdb/cgdb的话会报错,因为release版本的可执行文件没有调试信息,不能调试。用上一篇介绍的-g选项会让gcc/g++编译成debug版本

然后就进入了调试界面

我们需要再摁一下c,就可以看到代码了

gdb/cgdb命令
q或quit命令:退出调试
r/run:类似VS中的F5,程序开始运行
n/next:逐过程,不进入函数内部,如同VS中的F10
s/step:逐语句,进入函数内部,如同VS中的F11
b/break 文件名:行号:在此行打断点(/------表示或者,\[\]------表示可以省略)
b 函数名:在函数开头设断点
d/delete 编号:可以删除指定编号的断点(此处的编号指断点的编号------设置断点时会自动按顺序编号,可通过下一条指令查看)。编号换成breakpoints,可以将所有断点删除
info b/break:打印所有断点信息
下列三个命令是让我们体验到如同VS中调试窗口那样显示数据------方便调试
p/print 表达式/变量:打印表达式/变量的值(一次)
display 变量名:跟踪显示每个变量的值(只要程序停止就打印)
undisplay 编号:取消跟踪显示(编号是display某个变量时就会按顺序给这些变量编号,display打印时可以看到)
下面三个命令是可以实现跳跃调试的命令
until 文件名:行号:执行到指定行号(遇到断点也会停止)
c/continue:从当前位置开始执行直到遇到断点
finish:执行直到当前函数结束
disable 编号:可以使当前断点失效(如果没有确定问题解决,我们先不要急着删除断点)。编号换成breakpoints,可以将所有断点失效
enable是是断点重新生效,格式与disable相同
拓展:
watch 表达式/变量:监视表达式/变量的值,一旦发生变化就停止执行并打印
set var 变量名=某值:当我们发现某个错误是由于某个变量的值导致的,我们可以通过此命令将调试时变量值修正,检查结果是否正确,然后还需要去源码将错误修正
b 行号 if 条件:条件断点,满足条件时才会在此断点停止
condition 编号 if 条件:将此编号断点设为条件断点