1.bug
bug是漏洞,指电脑系统程序中的缺陷或问题
2.debug
debug是调试,即消灭bug。通过手段定位问题所在,通过逐过程调试、隔离和屏蔽代码,确定错误原因,修饰代码,重新测试。
3.debug&release
vs有debug和release选项。
3.1debug
调试版本,包含调试信息,不作优化,便于调试程序
如果经常需要调试,可以选择debug,编译生成的是debug版本的可执行程序,包含调试信息,可以直接调试
3.2release
发布版本。是已经经过了各种优化,在大小和速度上都已经是最优,可以直接让用户使用的。
开发工程师写完代码交给测试对程序进行测试,直到代码质量符合用户使用要求,这时就设置为release版本,编译产生的可执行程序是不包含调试信息,大小上也会比debug版本小。
4 vs调试快捷键
4.1环境
将解决方案配置设置为debug。
4.2快捷键
F9:创建断电和取消断点。断点作用是可以在程序任意位置设置断点,当程序执行到断点为止时暂时停止执行,接下来才用F10和F11等快捷键观察细节
条件断点,即满足条件才触发断点(比如要求跳到某一次循坏,省去繁琐的F10)
F5:启动调试,经常用来直接跳到下一个断点处,配合F9
F10:逐过程,用来处理一个过程,可以是一次函数调用,也可以是一条语句
F11:逐语句,每次执行一条语句,可以进入函数的内部执行过程,只有F11才能观察函数调用地方内部的执行细节
CTRL+F5:执行不调试。
5.监视和内存观察
观察发生了变化的量
5.1监视
调试-窗口-监视 可以打开监视窗口,输入要观察的对象即可(数组/变量/常量等)
5.2内存
当监视不足以观察时,可以使用内存
调试-窗口-内存
左边ox开头是内存的地址。中间英文和数字的组合是内存数据的十六进制状态。右边带有符号的是内存的数据解析只能观察文本信息。
输入arr,&num,&c这类地址,观察该地址处的数据。
栈区内存,习惯从高地址向低地址使用,变量i的地址是较大的,arr数组的地址整体是小于i的地址
数组在内存中的存放是:随着下标的增长,地址是由低到高变化的。
代码中变量内存分配和地址分配由编译器指定,不同编译器会产生区别
int main() { int i = 0; int arr[10] = { 0 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
在这个代码中,如果是vs环境,i与arr在内存栈区的存储,中间是2个整型空间的,循坏i到了13就会出现死循环,因为arr[12]在内存中与i的地址恰好一样,i每次到了13就会重置为0,arr[12]也是如此,因此造成死循环。
但越界的问题还是存在的,就算改成<=11,是会报出越界的错误。就算先定义数组再定义变量,也不影响越界的报错。
数组传参,数组名后面跟数字,数组名,n(一维数组中是展现的元素个数/二维数组中是出现的行数)
编译错误:基本是语法错误
链接错误:头文件没包含,拼写错误,标识符名不存在,引用的库不存在。