梦开始的地方——VS2019调试技巧
文章目录
- VS2019调试技巧
- 1. bug的由来
- 2. windows环境调试介绍
- 1. 常用快捷键
- 2. 调试的时候查看程序当前信息
- 3. 经典题目
- 4.Debug和Release
- 5. 断言
VS2019调试技巧
1. bug的由来
在几十年前的时候,那个时候只虫子爬到了当时的巨型计算机里,导致那台巨型计算出现了问题。而虫子的英文就是bug,bug这个词就由此诞生了。找bug也就是我们常见的调试,只有调试更快的找的bug。
2. windows环境调试介绍
注意:在vs2019中只有将环境学则为debug
才能调试
1. 常用快捷键
- F5
启动调试 - F9
在当前行打断,端点可以放在程序的任何位置,就可以让程序停止在你想停止的地方
- F10
逐个过程调试,调试的时候遇到函数会接着执行,并不会进入到函数内部,也就是看不到函数内部细节
- F11
逐语句,每按一次F11程序每执行一条语句,F11和F10的别是F11会**进入到函数内部
- ctrl + F5
直接执行程序不调试
2. 调试的时候查看程序当前信息
在开始调试后,可以用来观察变量的变化
观察内存变化
查看调用栈
甚至还可以转到反汇编
3. 经典题目
这段代码再vs2019的x86环境,devc++,Linux上都出现了死循环。
#include <stdio.h>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("hello\n");}return 0;
}
通过调试我们发现,当i=12的时候,arr[12]和变量i使用的是同一块地址,也就是arr[12]就是变量i。
每次到当i为12的时候都会把变量i赋值为0,就出现了死循环。
这是怎么一回事呢?
- 我们知道i和arr都是局部变量,而局部变量都是存放在内存存的栈区的。
- 而栈区内存的使用习惯:先试用高地址处的空间,再使用低地址的空间
- 而数组随着下标的增长地址是从低到高变化的
- 所以当数组在适当的越界的情况下就会导致数组的越界访问到循环变量i,就可能到死循环
- 也就是说arr[9]和变量i的地址相差了8个字节,所以就出现了越界访问导致了死循环
- 注意:不同的编译器它们之间相差的字节可能不一样,在vs2019的x86环境下是8个字节,而我在devC++上测试i等于11就出现了死循环,在Linux64位机器的CentOS7上也在等于11时就出现了死循环。
- 编译器忙着死循环就管不了越界哈哈。
4.Debug和Release
1.Debug版本:debug版本被称为调试版本,它包含调试信息,一般不会做任何优化,方便程序员调试
2.Release版本:release版本被称为发布版本,它一般都会对代码进行优化,在代码的大小和运行速度上往往都是最优的。方便用户去使用
继续来看上面那段代码,我们把环境切换成Release版本和Debug版本进行对比,发现就没有死循环了。那是因为Release版本进行了优化。
我们发现Release版本把变量i放到了arr数组的前面那块内存空间了,也就是地址比数组小,这样无论数组怎么越界就不会访问到i了
debug版本
Release版本
5. 断言
使用断言需要引入头文件#include <assert.h>
断言里的表达式为真什么都不发生,为假就会报错
来看一段代码
void prt(char* str)
{assert(str != NULL);printf("%s\n", str);
}
int main()
{prt(NULL);return 0;
}
当出入一个空指针就会触发断言报错
而如果是Releas版本,断言是会被优化掉的
梦开始的地方——VS2019调试技巧相关推荐
- VS2019 调试技巧之附加进程
C# 创建服务并附加到进程进行调试 步骤一: 在任务栏右键->>点击任务管理器->>选择服务,找到启动的进程PID 或者 WIN+R 进入cmd命令 输入 netstat - ...
- C语言之调试技巧(VS2019编译器)
C语言之调试技巧(VS2019编译器) 一.什么是调试?调试的作用 1.1 什么是调试 1.2 调试的基本步骤 1.3 Debug版本和Release版本的介绍 二.Windows环境调试的准备 2. ...
- 再分享 5 个 vs 调试技巧
前言 之前在<5 个非常实用的 vs 调试技巧>和<继续分享 5 个实用的 vs 调试技巧>中分享了 10 个我认为非常值得了解的 vs 调试技巧,本周继续分享 5 个很实用的 ...
- 程序员必备的VS调试技巧
文章目录 一.什么是bug 二.什么是调试及调试的重要性 1.什么是调试 2.调试的基本步骤 3.Debug和Release的介绍 三.Windows下VS常用调试快捷键 四.VS常用调试技巧 1.查 ...
- 你可能不知道的 IDEA 高级调试技巧
作者:十光年 www.cnblogs.com/jun1019/p/9741224.html 一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图, ...
- iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...
- Flutter调试技巧总结——高效开发的秘密
刚开始学前端的时候看到大家都是用的console.log()作为调试的手段,也可以说,很多人只会用console.log().在学习Flutter开发app的时候,我就在思考,除了使用print()来 ...
- [Cocoa]XCode的一些调试技巧
XCode的一些调试技巧 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 XCode 内置GDB,我 ...
- 你所不知道的 Android Studio 调试技巧
Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样, ...
- 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......
反调试技巧总结-原理和实现 -------------------------------------------------------------------------------------- ...
最新文章
- 基于Go语言来理解Tensorflow
- go 通过nginx代理后获取用户ip
- json最大长度限制_GET请求中URL的最大长度限制总结,读完之后,大部分程序员收藏了...
- 微软MSRA成立理论中心,陈卫负责马志明等四院士加盟
- linux下安装编译网卡驱动
- socket python实例_Python网络编程—第27课—Socket实例(0531)
- 数据库之SqlDataAdapter
- 怎么会Sql serverW数据库模型图转化成ord于--您还可以查看属性信息字段
- 闭包,作用域链,垃圾回收,内存泄露
- error汇总:dpkg: error processing package *** (--configure)
- python文本数据处理_python 数据处理 对txt文件进行数据处理
- 使用DIDatepicker
- 程序设计语言的发展过程
- Foobar音乐播放器——最佳音乐播放器 - imsoft.cnblogs
- itunes gift card apple id 充值接口API秒冲接口收藏
- 用python计算有效前沿_【投资组合理论】Python绘制上证50成分股有效前沿和CML
- 实战—深圳链家租房数据分析
- 北斗导航 | EagleEye2000:国产激光雷达走进测绘世界
- 百度地图 - 添加区划覆盖物 - 循环打点
- HEVC代码学习6:filterHor和filterVer函数