精通 VS 调试技巧,学习与工作效率翻倍!

这篇具有很好参考价值的文章主要介绍了精通 VS 调试技巧,学习与工作效率翻倍!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

精通 VS 调试技巧,学习与工作效率翻倍!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨

​ 🎈🎈养成好习惯,先赞后看哦~🎈🎈

​ 所属专栏:C语言学习

​ 贝蒂的主页:Betty‘s blog

1. 什么是调试

当我们写代码时候常常会遇见输出结果不符合我们预期的情况,那这时候我们该怎么办呢?

这时候我们就需要调试(debug),调试简单来说就是去寻找问题,找到错误原因,修改代码的过程。

2. Debug和Release

精通 VS 调试技巧,学习与工作效率翻倍!

  1. 在VS编译器中有着这Debug和Release两个选项,他们分别是调试版本发布版本,那这两者有什么区别么,我们可以看看下表
名称 优点 缺点
Debug 包含调试信息,易于调试 未做任何优化,体积大
Release 体积小,编译时对应用程序的速度进行优化 无法调试
  1. Debug文件与Release文件(需要代码运行才生成)

精通 VS 调试技巧,学习与工作效率翻倍!

精通 VS 调试技巧,学习与工作效率翻倍!

通过观察我们可以知晓,Release生成的应用文件要比Debug生成的应用文件小的多

3. 调试快捷键

我们在调试过程中可以使用一些快捷键帮助我们节省时间。

下表列出了比较常用的快捷键以及其功能:

快捷键 功能
F5 启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是和F9配合使⽤。
F9 创建断点和取消断点
F10 逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。
F11 逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。在函数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。
CTRL+F5 开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。
  • 断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂定执⾏,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。

4. 监视和内存观察

4.1 监视

在调试的过程中我们,如果要观察代码执⾏过程中上下⽂环境中的变量的值,这时候就要用到监视
比如我们要监视下面这段代码:

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}
  1. 打开监视(提前F11启动调试)

精通 VS 调试技巧,学习与工作效率翻倍!

精通 VS 调试技巧,学习与工作效率翻倍!

  1. 监视变量

通过监视变量的变化,能够更好的发现错误信息

精通 VS 调试技巧,学习与工作效率翻倍!

4.2 内存

除了探究变量改变状况,我们还可以探究变量在内存中的存储

我们还是以上面那段代码举例:

  1. 打开内存(提前F11启动调试)

精通 VS 调试技巧,学习与工作效率翻倍!

精通 VS 调试技巧,学习与工作效率翻倍!

  1. 内存信息

精通 VS 调试技巧,学习与工作效率翻倍!

精通 VS 调试技巧,学习与工作效率翻倍!

精通 VS 调试技巧,学习与工作效率翻倍!

5. 调试举例

5.1 实例一:简单调试

计算 1!+2!+3!的和

错误代码:

int main()
{
	int i = 0;
	int ret = 1;
	int sum = 0;
	for (i = 1; i <= 3; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("%d ", sum);
	return 0;
}

输出结果: 15

有时候我们不能一下子看出错误,这时候我们就需要调试

  1. 第一步分析

    1!=1

    sum=1

    2!=2

    sum=3

    3!=6

    sum=9

  2. 监控变量并调试分析

    • 第一步没问题,F10继续调试
      精通 VS 调试技巧,学习与工作效率翻倍!
    • 第二步没问题,F10继续调试
      精通 VS 调试技巧,学习与工作效率翻倍!
    • 第三步有问题
      精通 VS 调试技巧,学习与工作效率翻倍!
    • 增加变量继续分析
      精通 VS 调试技巧,学习与工作效率翻倍!

为什么ret的值会出现不符合预期的情况呢?我们再次观察代码就会发现ret的值在每次使用后都没有更新,所以出现不符合预期的情况

正确代码:

int main()
{
	int i = 0;
	int ret = 1;
	int sum = 0;
	for (i = 1; i <= 3; i++)
	{
		ret = 1;//更新
		for (int j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("%d ", sum);
	return 0;
}

5.2 实例二:深度理解

在VS2022、X86、Debug的环境下,下⾯代码输出结果是什么?

#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("betty\n");
	}
	return 0;
}

输出结果:死循环打印betty

为什么会出现下面结果呢?这段代码不是越界访问了吗?这时我们又要调试起来

  • 数组未越界时,并没有发现问题

精通 VS 调试技巧,学习与工作效率翻倍!

  • 数组越界时,我们发现当arr[12]=0时,i也变为0,这也是为什么代码会死循环的原因

精通 VS 调试技巧,学习与工作效率翻倍!

  • 为什么改变arr[12]的值,i也随之改变呢?我们猜测i与arr[12]的地址相同

精通 VS 调试技巧,学习与工作效率翻倍!

  • 事实也证明我们的猜测是正确的

那为什么会这样呢?我们要知道以下三点:

  • 局部变量一般存储在内存中的栈区
  • 栈区内存的使⽤习惯是从⾼地址向低地址使⽤的,所以变量i的地址是较⼤的。arr数组的地址整体是⼩于i的地址。
  • 数组在内存中的存放是:随着下标的增⻓,地址是由低到⾼变化的。

图像演示如下

精通 VS 调试技巧,学习与工作效率翻倍!

  • 原因:在该环境下,arr与i的地址直接刚好差两个整型,当越界访问到arr[12]时刚好与i的地址重合,所以改变arr[12]的值也会改变i的值,代码也就会死循环

注意:

  1. 在不同的编译器下可能arr与i空出的空间⼤⼩是不⼀样的,代码中这些变量内存的分配和地址分配是编译器指定的,所以的
    不同的编译器之间就有差异了。所以这个题⽬是和环境相关的。

  2. 栈区的默认的使⽤习惯是先使⽤⾼地址,再使⽤低地址的空间,但是这个具体还是要编译器的实现,⽐如:在VS上切换到X64,这个使⽤的顺序就是相反的,在Release版本的程序中,这个使⽤的顺序也是相反的。

5.3 实例三:断点调试

我们知道了简单调试该如何去调,那断点调试该如何去进行呢?

我们以下面这段代码举例:

int main()
{
	int i = 0;
	for (i = 0; i < 100; i++)//第一步
	{
		printf("Betty ");
	}
	int arr[10] = { 0 };
	for (i = 0; i < 10; i++)//第二步
	{
		//.....
	}
	return 0;
}
  1. 如果我们可以确定第一步没有问题,问题出现在第二步,如果一步一步调试的话,要调试100次才会到第二步
  2. 所以这时候我们就需要用到断点
    • 首先我们选中要调试的行数,按下F9打下断点,然后F5开始调试

精通 VS 调试技巧,学习与工作效率翻倍!

  1. 如果觉得第一步i==50时有问题,也可以在第一步设置断点,然后右击断点设置条件

精通 VS 调试技巧,学习与工作效率翻倍!

6. 编译器报错

6.1 编译型错误

编译型错误⼀般都是语法错误,这类错误⼀般看错误信息就能找到⼀些蛛丝⻢迹,双击错误信息也能初步的跳转到代码错误的地⽅或者附近。

精通 VS 调试技巧,学习与工作效率翻倍!

6.2 链接型错误

链接型错误一般是因为标识符名不存在拼写错误头文件未包含引⽤的库不存在

精通 VS 调试技巧,学习与工作效率翻倍!

6.3 运⾏时错误

运行时错误复杂多样,一般需要借助调试的手段才能发现文章来源地址https://www.toymoban.com/news/detail-821523.html

到了这里,关于精通 VS 调试技巧,学习与工作效率翻倍!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS实用调试技巧

    Bug一词的原意是虫子,而在电脑系统或程序中隐藏着的一些未被发现的 缺陷或问题 ,人们也叫它\\\"bug\\\"。这是为什么呢?这就要追溯到一个程序员与飞蛾的故事了。 Bug的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电

    2024年02月01日
    浏览(39)
  • VS的调试技巧

    Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/ 目录  1、什么是调试? 2、debug和release 3、调试 3.1、环境 3.2、 快捷键 3.2.1、F10和F11 3.2.2、ctrl+F5 3.2.3、F5与F9  3.2.3.1、条件断点 3.3、监视和内存观察 3.3.1、监视 3.3.2、内存 当我们发现程序中存在的问题的时候,那下⼀步就是找到

    2024年02月10日
    浏览(31)
  • 全文高能!提高工作效率的9个VS Code扩展插件

    1/ Path Intellisense 这个扩展会自动补全文件名。就像在 HTML 中使用标签一样,它会自动补全标签。 2/ Live Server 这个扩展允许你在浏览器上启动本地项目并进行实时重载,这样你就不必在每次更改后不停地刷新了。 3/ CodeGeeX CodeGeeX 是一个使用AI技术的辅助编程工具,帮助开发人员

    2024年02月11日
    浏览(32)
  • vs2022的一些调试技巧——远程调试&线程检查&性能检查

    visual studio一直都是.net/c#开发人员最受欢迎的编译器,除了强大的代码提示和项目模板,还拥有大量的调试工具,这一期我们介绍下 code freeze 阶段的一些调试技巧。包括测试环境/生产环境下的远程调试,线程调试,以及性能监控调试。 目录 远程调试 1 安装 2.调试 线程调试

    2024年02月07日
    浏览(40)
  • 巡课技巧,工作再忙也要学会!提高效率杠杠的

    在当今不断演变的教育环境中,教学质量的提升和教师专业发展变得尤为重要。为了更好地监督和评估教师的教学表现,以及促进学生在课堂中的积极参与,在线巡课系统应运而生。 通过实时观察、远程巡课、数据分析等功能,该系统不仅为教育管理者提供了更全面的了解,

    2024年02月14日
    浏览(26)
  • 编程技巧 --- VS如何调试.Net源码

    如题,在VS中如何调试 .Net 源码呢? 一般来说,VS2022,都是默认启用 F12 转到定义能够看到源码,如果大家发现自己无法使用 F12 查看源码,可以在 \\\"工具\\\" - \\\"选项\\\" - \\\"文本编辑器\\\" - \\\"C#\\\" - \\\"高级\\\" - \\\"转到定义\\\",勾选所有选项就对了。 但是光以上的操作还是不够的,这样的可以查

    2024年02月05日
    浏览(65)
  • 一步到位!快速精通Git工作流及实战技巧详解

    Git是一个分布式版本控制系统。 1.备份 小明负责的模块就要完成了,就在即将release之前的一瞬间,电脑突然蓝屏。硬盘光荣牺牲!几个月来的努力付之东流。 场景二:代码还原 这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的

    2024年03月15日
    浏览(56)
  • 你真的知道怎么使用vs吗?把把手教你实用调试小技巧

    谈到bug,我们知道bug的中文意思是虫子,飞蛾的意思。至于为什么bug一词会用到计算机领域的话得追溯到第一台计算机的诞生。 上面个你看到的就是世界上第一个bug的诞生。它的来源也是非常的有意思,当时世界上的第一台计算机出了故障不能正常的工作,于是工作人员就进

    2024年02月05日
    浏览(33)
  • 20款超级好用的idea插件,开发效率翻倍!!!

    在使用IntelliJ IDEA进行开发时,许多插件可让开发人员更高效地编写代码。以下是我推荐的20个在IDEA中好用的插件: 在右侧编辑器旁边添加一个缩略图以查看整个文件的结构。 当您使用IDEA中的菜单或快捷键时,会提供提示以帮助您记住更好的快捷方式。 通过提供注解和其他

    2024年02月06日
    浏览(77)
  • 免费用的 AI 工具 CodeGeeX ,开发效率翻倍!!!

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、AI使用教程 二、工作提效 2.1 AI 导师 2.2 AI 程序助手 2.3 AI 测试员  2.4 AI Bug 修复师 三、其他能力 四、总结 AI 会淘汰程序员,但只会淘汰不会用 AI 的程序员。

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包