1.什么是bug?
1.什么是bug?
bug的意思是**“虫子”或“昆虫**”,一般是指在电脑系统或程序中,隐藏在系统或程序中的一些缺陷或漏洞,简称——程序漏洞。
它是由美国计算机科学家“格蕾丝·赫柏(Grace Murray Hopper)”发明的。
他在一次工作中,发现马克二号(Mark Ⅱ)计算机出现故障不能运行,最终发现是一只飞蛾飞进了实验室,夹在继电器中。后来格蕾丝把这个排错过程记录到笔记本中,把飞蛾的标本也贴在那里,后来bug (小虫) 和debug (除虫)就成了计算机领域中找错的专用词汇,一直沿用到今天。
2.什么是调试,调试的重要性
(1)什么是调试?
当一个程序在执行的过程存在问题时,我们就需要去寻找问题,那寻找的这个过程呢,我们就叫——调试,调试的英文名叫debug(消灭bug)。
(1)调试的重要性*
学会调试是合格的程序员的基本技能,这是一个发现问题,并能精准的找到问题所在之处,然后通过调试来决解问题。
3.debug和release
Debug称为调试版本,它仅包含调试信息,不做任何的优化,可以直接调试。
Release称为发布版本,它比Debug版本的使用效率更高,能进行各种优化,这就使得程序的代码大小和运行的速度效率比Debug更高,这更适合程序员对程序进行测试,无需包含调试信息。
看到Debug和Release相比,我们很明显的可以看出区别,Debug可以调试,而Release不能调试信息
4.VS常见的调试快捷键
Ctrl + Alt + B——它的作用是可以在程序的任意位置设置断点,结合F11,F10来观察代码的细节
Ctrl + Alt + A——异常设置
Ctrl + Alt + F2——显示诊断工具
Ctrl + Shift + D,K——任务
Ctrl + Shift + D,S——并行堆栈
Ctrl + Alt + V,L——局部变量
Ctrl + Alt + I——即时
Ctrl + Alt + C——调用堆栈
Ctrl + Alt + H——线程
Ctrl + Alt + U——模块
Ctrl + Alt + Z——进程
Ctrl + Alt + D——反汇编
Ctrl + Shift + Alt + D——诊断分析
Ctrl + Alt +G——寄存器
Ctrl + Shift + F9——删除所有断点
Shift + F9——快速监视
Shift + F5——停止调试
Ctrl + Shift + F5——重新调试
Shift + Alt + F2——性能探查器
Alt + F2——重启性能探查器
Ctrl + Shift + B——生成解决方案
Ctrl + Shift + S——全部保存
Ctrl + X——剪切
Ctrl + C——复制
Ctrl + D——复制
Ctrl + V——粘贴
Ctrl + A——全选
Ctrl + Shift + V——显示剪切板历史记录
Ctrl + Alt + B——它的作用是可以在程序的任意位置设置断点,结合F11,F10来观察代码的细节
条件断点:——满足条件,才能触发断点
F5——启动调试,并且可以用来跳到下一个断点去(配合F9使用)
Ctrl + F5: ——直接 运行程序但是不调试
Shift+F5:——停止调试
F9:——取消断点和启用断点
Ctrl+F9——停止断点
F10:——逐过程用来处理每一个过程,一个过程可以是一次函数调用,或者是一条语句
Ctrl+F10——运行到光标处
F11:—— 逐语句,再每执行一条语句,可以让我们执行的逻辑进入到函数内部观察细节
5.调试查看程序当前信息
5.1监视
开始调试之后,才能看到监视(共四个监视,点其中一个即可)
**
5.2内存
共四个内存,点其中一个即可
5.4反汇编
5.5寄存器
6.调试的实例
(1)求1!+2!+3!……10!的阶乘
错误的代码——与预期的结果不同
#include<stdio.h>
int main() {
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
for(i = 1; i <= n; i++)
{
ret *= n;
}
sum += ret;
}
printf("%d\n",sum);
return 0;
}
与预期的结果不同
正确
#include<stdio.h>
int main() {
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
ret *= n;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
>
预期结果
(2)
这是在vs2022——Debug——x64版本的环境下编译的结果
错误的代码——程序会死循环
#include<stdio.h>
int main() {
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++) {
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
调试之后看到的结果
调试上面程序的内存布局如下:
1.栈区默认先使用高地址,再到低地址,那我们可以看到变量i的地址是较大的,而arr数组的地址事小于i的地址
2.数组在内存中的存放遵循随下标的增长,地址由低到高变化的。
可以看到调试的重要性,只有调试才能观察到程序内部执行 的细节,
注意:栈区默认先使用高地址,再到低地址这样一个空间。在vs切换到x64,这个使用顺序是相反的,Release版本中也是一样的
7.编程常见错误的类型
7.1编译型错 误
编译型错误一般都是语法错误,这类错误一般看错误信息就能看找到一些蛛丝马迹,双击错误信息也能初步 跳转到代码错误的地方或附近
7.2链接型错误
看到错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在,一般是因为
@@标识符名不存在
@@拼写错误
@@头文件没包含
@@引用的库不存在
7.3运行时的错误
运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时的问题(预期的结果错误)