What is bug?
来源:最早计算机程序出故障后,维修人员在其中找到了一只虫子,后来令程序故障的问题,被称为bug,找bug的过程就是调试(Debug)。
调试重要吗?
对于初学者而言,如果不了解调试,不会调试。在遇到bug的时候,你可能会苦恼:为什么无法运行?为什么结果不对?然后用眼睛去看自己的代码,经过漫长的修改之后,程序可以运行了,你可能依旧苦恼:为什么这样可以?苦思冥想后开始怀疑自己,去各大平台去找相关资料,认为自己没有学好,想要重学一遍,然后时间这样过去了,可能还没学到什么东西。相信我,这样重复几次,你会怀疑自己不适合干这个,
调试步骤:
1.发现程序的错误所在
2.以隔离、消除等方式对错误进行定位。
3.确定错误产生的原因
4.提出纠正错误的解决办法
5.对程序错误进行改正、重新测试.
这是一般公司里的调试步骤,那么对于初学者个人而言的调试是怎样的呢?
Part1:
Debug Release
Debug版本和Release版本在vs2022版本中可以在上方栏中显示,根据需要进行切换,
在我们编译前(创建工作区后),找到对应文件,在编译后会出现一个x64,里边会有debug文件夹,里头有着该程序的可执行文件。再换成Release版本,编译运行后会出现Release文件夹,其中同样会有一个可执行文件。调试版本和发布版本有什么区别呢?
Part2:
可调试 大小 功能 环境
Debug版本是可以调试的版本,具备调试环境,大小也要比Release版本大很多,因为Release版本是对代码进行优化过的,且不具备调试环境,也是测试去测的那个版本。
Part3:
环境配置 快捷键 F5 F9 F10 断点 F11
首先要进行环境配置,这里只需要调为Debug版本就可以了,再了解一下常用的快捷键及其功能,F5,是开始调试,F9是设置断点(也可以用鼠标点击行左边),F5会按照逻辑将程序运行到下一个断点处停下。F10是逐过程一步一步往下走,但不会进入函数中去,F11是逐语句,和F10类似,但会进入到函数中去(自定义的那种),Shift+F11跳出函数。Shift+F5会结束调试,Ctrl+F5是直接执行而不调试,更多快捷键可以去编译器里找。
Part4:
观察 窗口 监制 自动 局部变量窗口 内存 反汇编 寄存器 调用堆栈 条件断点
调试的时候我们是需要去观察一些数是如何变化的,它们的地址在哪?这个时候我们就需要一些窗口。调试的时候点击窗口,会有很多,这里先介绍一下自动窗口和局部变量窗口,它们所观察的对象都是由编译器自动加上的,也会自动删除,不同的是后者出现的是局部变量,创建时出现,出函数或者某个{}的时候就会消失,并且这两个窗口是无法添加变量的。
监视窗口,这个功能和前两者相同,但需要自己添加想要观察的对象,可以添加和删除。
内存窗口,会以十六进制显示地址和内存单元内的内容。
反汇编,寄存器,前者会给出每一步对应的汇编,后者会把寄存器中的数据以十六进制显示出来。
调用堆栈窗口,会显示调用函数的顺序等。
条件断点:在断点(红点)处右击可以找到。作用:例如在for循环中可以讲条件设置为i==4等来使程序停在此处。
Part5:strcpy函数示例 assert断言函数 函数优化 常量const
自己去实现strcpy函数,我们自己写函数,当然知道它是干什么用的,但我们写代码终究(吃饭)是给他人用的,保不准就会用一些奇怪的数字,从而导致程序崩溃。一个安全的代码要考虑这些事情。针对这个问题,我们有assert函数,它会更具我们输入的判断来提示错误assert(p!=NULL),当p==NULL时会输出一个错误信息在界面上。
这就够了么?还没有!万一有人把两个顺序搞反了,这个时候恰好字符数量相同,对方只是调用了一下,以为成功了,那就很危险了,他可能会因此调试大半天。
Const,放在变量前,使其值不可再改变,const*p :这里指的是(*p)不可改变,也就是值,这样顺序反了编译器也会报错。看另一个*const p:这里是指(p)不可改变,p是指针变量,里边存放的是地址。此时地址不可变。
Part6:
常见错误:编译,链接 无法解析 外部 名字 定义 运行时
写代码常见的错误,编译错误,就是单纯的语法错误,链接错误,编译器会显示一个无法解析的外部命令等,一般是调用的函数未定义或者名字打错了,还有一个就是运行时出现的错误这个错误比较难搞,需要自己去调试,大多是逻辑错误。