这里一定有你不知道的VS调试技巧

 

目录

使用环境: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运⾏时错误

运⾏时错误,是最恐怖的,明明可以运行成功,但有时候就不是你想要的效果。甚至定时出现,那可能就是在吃内存,内存没了程序就崩掉了

你们的点赞、关注、收场是博主最大的动力!求三连

  • 34
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值