当前位置: 首页 > news >正文

这里一定有你不知道的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运⾏时错误

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

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

相关文章:

  • 【Java】刚刚!突然!紧急通知!垃圾回收!
  • 2024 rk
  • 记录【KVM更改br0网卡IP后,原来ip地址仍在问题】
  • 苍穹外卖数据可视化
  • js将dom转图片或文件
  • MySQL-事务日志
  • 轻兔推荐 —— 一个好用的软件服务推荐平台
  • 【算法】模拟算法——外观数组(medium)
  • 算法题day36(补5.22日卡)
  • 【摩托game】
  • 图像处理ASIC设计方法 笔记26 非均匀性校正SOC如何设计
  • adb server version (22000) doesn‘t match this client (41); killing...
  • 重生之我想写后端
  • 2006NOIP普及组真题 2. 开心的金明
  • Linux|Linux常用命令合集(一)
  • “大数据应用场景”之隔壁老王(连载四)
  • 2019.2.20 c++ 知识梳理
  • android图片蒙层
  • bootstrap创建登录注册页面
  • django开发-定时任务的使用
  • ECMAScript6(0):ES6简明参考手册
  • Fastjson的基本使用方法大全
  • java多线程
  • Linux各目录及每个目录的详细介绍
  • mongo索引构建
  • PHP CLI应用的调试原理
  • Python - 闭包Closure
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 实现菜单下拉伸展折叠效果demo
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • # Maven错误Error executing Maven
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (14)Hive调优——合并小文件
  • (3)nginx 配置(nginx.conf)
  • (3)STL算法之搜索
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (剑指Offer)面试题34:丑数
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十三)Flask之特殊装饰器详解
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)Neo4j下载安装以及初次使用
  • (转)Oracle存储过程编写经验和优化措施
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • **CI中自动类加载的用法总结
  • .bat文件调用java类的main方法
  • .NET Core中Emit的使用
  • .Net 高效开发之不可错过的实用工具
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 生成二级域名