目录
使用环境:Visual Studio 2022,如无特殊说明,都是在Debug、x64环境下编译
一.什么是BUG
二.调试快捷键
F9:创建断电或取消断点
条件断点:满足这个条件才触发
F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是和F9配合使⽤。
CTRL+F5:开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。
F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。
F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。在函 数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。
三.监视和内存观察
3.1监视
特别注意:形参调用数组编辑
3.2内存
四.Debug和Release
五.分析一个有意思的代码
六.编程常⻅错误归类
6.1编译型错误
6.2链接型错误
编辑 6.3运⾏时错误
使用环境:Visual Studio 2022,如无特殊说明,都是在Debug、x64环境下编译
一.什么是BUG
简单的说就是因为各种原因,语法原因或运行成功,但结果有差异等。
二.调试快捷键
F9:创建断电或取消断点
断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂定执 ⾏,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。
条件断点:满足这个条件才触发
第一步:设置断点后,鼠标右击红色断电标记,点击条件
第二步:根据需求,选择条件输入条件
已i==5为列:
按快捷键F5,效果:
F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是和F9配合使⽤。
CTRL+F5:开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。
F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。
F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。在函 数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。
VS更多快捷键了解:http://blog.csdn.net/mrlisky/article/details/72622009
三.监视和内存观察
3.1监视
监视调用方法:
随后弹出:
在此添加想要观察的变量名,数组名等
注意:变量在程序步骤中还未创建时,监视会有报错不用急,只是因为程序还未执行到创建变量的步骤,根据需求按F10或者F11执行创建语句后就可观察
特别注意:形参调用数组
可以看到,在main函数里时,数组可以看到所有元素,但是到了test1函数里时,观察形参数组只能看到首位元素了。
再看,如果调用二维数组
arr2[3][5]; 三行五列的数组,也只能观察到第一行数组.
其原因是:数组的传参是,传的数组首元素的地址,还和编译器有关
想要看到,除首元素外的其他元素,其实只需要,特定的输出方式
输入格式是:
数组名,元素个数(二维数组也可以理解为行数)
列:
arr1,10
arr2,3
3.2内存
步骤:
内存更加方便我们观察数据,更利于对代码后面执行内存的理解
四.Debug和Release
在VS上编写代码的时候,就能看到有 debug 和 release 两个选项,分别是什么意思呢?
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序; 程序员在写代码的时候,需要经常性的调试代码,就将这⾥设置为 debug ,这样编译产⽣的是 debug版本的可执⾏程序,其中包含调试信息,是可以直接调试的。
Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的, 以便⽤⼾很好地使⽤。当程序员写完代码,测试再对程序进⾏测试,直到程序的质量符合交付给⽤⼾ 使⽤的标准,这个时候就会设置为 release ,编译产⽣的就是 release 版本的可执⾏程序,这个 版本是⽤⼾使⽤的,⽆需包含调试信息等。
对比:
对⽐可以看到从同⼀段代码,编译⽣成的可执⾏⽂件的⼤⼩,release版本明显要⼩,⽽debug版本明 显⼤。编译器对Release版本,进行了优化处理
五.分析一个有意思的代码
此代码,需要特定的环境:
在VS2022、X86、Debug的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥?
#include <stdio.h> int main() { int i = 0; int arr[10] = {0}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
看代码先给出你的答案!!!!!
看代码先给出你的答案!!!!!
看代码先给出你的答案!!!!!
看代码先给出你的答案!!!!!
看代码先给出你的答案!!!!!
看代码先给出你的答案!!!!!
相信大家大部分人可能都是觉得,只是越界访问。
那么我们看运行效果:
哎!居然没有警告,而且在无限次的打印代码,当时我看到这个结果引起了我强烈的好奇心
这⾥肯定有疑问:为什么i和arr 数组之间恰好空出来2个整型的空间呢?这⾥确实是巧合,在不同的编译器下可能中间的空出的空间⼤⼩是不 ⼀样的,代码中这些变量内存的分配 和地址分配是编译器指定的,所以的 不同的编译器之间就有差异了。所以 这个题⽬是和环境相关的。
从这个理解我们能够体会到调试的重要性,只有调试才能观察到程序内部执⾏的细节,就像医⽣给病 ⼈做B超,CT⼀样。
并且,有一个公司也出了这样一个面试题:
那么如果没有了解相关知识,那么面试官肯定就不会在你试卷上想要的答案了!!!
六.编程常⻅错误归类
6.1编译型错误
编译型错误⼀般都是语法错误,这类错误⼀般看错误信息就能找到⼀些蛛丝⻢迹的,双击错误信息也 能初步的跳转到代码错误的地⽅或者附近。编译错误,随着语⾔的熟练掌握,会越来越少,也容易解 决。
6.2链接型错误
看错误提⽰信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。⼀般是因为
- 标识符名不存在
- 拼写错误
- 没包含头文件
- 引用的库不存在
6.3运⾏时错误
运⾏时错误,是最恐怖的,明明可以运行成功,但有时候就不是你想要的效果。甚至定时出现,那可能就是在吃内存,内存没了程序就崩掉了
你们的点赞、关注、收场是博主最大的动力!求三连