✨个人主页: 熬夜学编程的小林
系列专栏: 【C语言详解】 【数据结构详解】
VS调试技巧
1、什么是bug
2、什么是调试(debug)?
3、Debug和Release编辑
4、VS调试快捷键
4.1、环境准备
4.2、调试快捷键
5、监视和内存观察
5.1、监视
5.2、内存
6、调试举例1
7、调试举例2
8、编程常见错误归类
8.1、编译型错误
8.2、链接型错误
8.3、运行时错误
总结
bug本意是“昆虫”或“虫子”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或问题,简称程序漏洞。
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序;程序员在写代码的时候,需要经常性的调试代码,就将这里设置为 debug ,这样编译产⽣的是 debug 版本的可执⾏程序,其中包含调试信息,是可以直接调试的。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的, 以便用户很好地使用。当程序员写完代码,测试人员再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会设置为 release ,编译产生的就是 release 版本的可执行程序,这个 版本是用户使用的,无需包含调试信息等。
F9:创建断点和取消断点断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂定执行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执行细节。条件断点:满足这个条件,才触发断点。
F5:启动调试,经常用来直接跳到下⼀个断点处,⼀般是和F9配合使用。F10:逐过程,通常用来处理⼀个过程,⼀个过程可以是⼀次函数调用,或者是⼀条语句。F11:逐语句,就是每次都执行⼀条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,直接完成函数调用。CTRL + F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
#include
int main()
{
int arr[10] = { 0 };
int num = 100;
char c = 'w';
int i = 0;
for (i = 0; i < 10; i++)
{
arr[i] = i;
}
return 0;
}
#include
//写⼀个代码求n的阶乘
int main()
{
int n = 0;
scanf("%d", &n);
int i = 1;
int ret = 1;
for(i=1; i<=n; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
//如果n分别是1,2,3,4,5...10,求出每个数的阶乘,再求和就好了
//在上⾯的代码上改造
int main()
{
int n = 0;
int i = 1;
int sum = 0;
int ret=1;
for(n=1; n<=10; n++)
{
for(i=1; i<=n; i++)
{
ret *= i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
//运⾏结果应该是错的?
#include
int main()
{
int n = 0;
int i = 1;
int sum = 0;
int ret = 1;
for (n = 1; n <= 10; n++)
{
ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
#include
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. 数组在内存中的存放是:随着下标 的增长,地址是由低到高变化的。 所以根据代码,就能理解为什么是左边的代码布局了。 如果是左边的内存布局,那随着数组下标的增长,往后越界就有可能覆盖到i,这样就可能造成死循环的。
编译型错误⼀般都是语法错误,这类错误⼀般看错误信息就能找到⼀些蛛丝马迹的,双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误,随着语言的熟练掌握,会越来越少,也容易解决。
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。⼀般是因为• 标识符名不存在• 拼写错误• 头文件没包含• 引用的库不存在
运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运⾏时问题。
本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!