vs实用调试技巧

 前言:

我们在写程序的时候可能多多少少都会出现一些bug,使我们的程序不能正常运行,所以为了更快更好的找到并修复bug,使这些问题迎刃而解,学习好如何调试代码是每个学习编程的人所必备的技能。

1. 什么是bug?

我们把导致计算机无法正常工作的东西叫做bug

2. 调试的介绍

(以下的代码都是在vs进行调试的)

2.1 调试是什么?

调试(英语:Debugging/Debut),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

2.2 调试的基本步骤

发现程序错误的存在

以隔离、消除等方式对错误进行定位

确定错误产生的原因

提出纠正错误的解决方法

对程序错误给予改正,重新调试

2.3 Debug和Release的介绍

Debug通常被称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。

Release成为发布版本,它往往是进行了各种优化,是的程序在代码大小和运行速度上都是最优的,以便用户更好的使用。

3.Windows环境调试介绍

3.1 调试环境的准备

在环境中选择Debug选项才能正常调试。(如上图)

3.2 学会快捷键

F5

启动调试,经常用来直接跳到下一个断点处。

F9

创建断点和取消断点

断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

F10

逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或是一条语句。

F11

逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。

CTRL + F5

开始执行不调试,如果你想要程序直接运行起来而不调试就可以直接使用。

F10与F10的区别:在调用函数的时候,F11会进入被调用的函数内,而F10不会。

F10 :

F11

3.3 调试如何查看当前的信息

 当调试开始的时候可以按照下图的步骤来查看我们想要查看的信息。

3.3.1 查看临时变量的值 

要想查看临时变量的值我们可以按照上图的方法开启监视窗口,然后在监视窗口输入我们想要观察的临时变量。

查看形参的值:

仅仅输入形参的名字,只会显示形参的第一个值。(如下图)

 而要想查看临时变量的多个值就需要用到“临时变量名+,+想要查看的值的数量”的输入方式进行查看。

例如,查看临时变量的前10个值就可以这样输入:a,10(如下图) 

3.3.2 查看内存信息

打开内存窗口后我们可以看到下图的界面。

3.3.3  查看调用堆栈

调佣堆栈反映了函数调用的逻辑

3.3.4 查看反汇编信息

反汇编可以将我们的c语言代码翻译为汇编代码

4.一些调试的实例

4.1 示例一

实现代码:求1!+2!+3!+...+ n!;不考虑溢出。

错误代码:

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

发现错误: 

 

当输入3时正确的结果应改为9但是这里显示的是15。

查找错误原因:

打开监视窗口查看这里临时变量的值

我们可以看到当执行一次for循环这里显示的值是没有任何问题的。

因为ret在这里的预期作用是求i的阶乘,当执行完第三次for循环时,这里i值为3所以ret的预期值为6,但是监视这里显示的值为12,这与所得的结果有所差异,所以这里的错误就应该在ret的上。 

解决问题:
对代码分析后发现当执行完一次for循环后ret的值并没有重新赋值为1,而是带着上一次for循环得到的值直接进行了下一次for循环的乘积。所以正确的代码应该为:

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

5. 如何写出好(易于调试)的代码。

5.1 优秀的代码:

1.代码运行正常

2.bug很少

3.效率高

4.可读性高(你看得懂,别人也看得懂)

5.可维护性高

6.注释清晰

7.文档齐全

常见的coding技巧:

1.使用assert

2.尽量使用const

3.养成良好的编码风格

4.添加必要的注释

5.避免编码陷阱(编码陷阱是指在编程中,由于程序员的疏忽或者不熟悉某些编码规范而导致的错误。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html canvas怎么在图片上面加文字

在HTML canvas中&#xff0c;要让文字显示在图片上方&#xff0c;你需要按照以下步骤操作&#xff1a; 首先&#xff0c;使用drawImage()方法将图片绘制到canvas上。 然后&#xff0c;使用fillText()或strokeText()方法在canvas上绘制文本。 以下是一个简单的示例代码&#…

C#Socket通信实现

1.编写服务端代码&#xff0c;以原石兑换码为例&#xff08;分别建立两个控制台应用&#xff0c;一个用于服务端&#xff0c;一个用于客户端&#xff09; using System.Net.Sockets; using System.Net; using System.Text;namespace 网络游戏服务器 {internal class Program{s…

【Eviews实战】——重庆市居民消费城乡差异研究

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

Python内存管理与垃圾回收机制:深入理解与优化【第138篇—RESTful API】

Python内存管理与垃圾回收机制&#xff1a;深入理解与优化 在Python编程中&#xff0c;内存管理与垃圾回收机制是至关重要的主题。了解Python如何管理内存和处理垃圾回收对于编写高效、稳定的程序至关重要。本文将深入探讨Python中的内存管理和垃圾回收机制&#xff0c;包括内…

【ARM】UBL本地服务器离线激活license

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 UBL本地服务器离线激活license。 2、 问题场景 解决有用户外出时激活 license。 3、软硬件环境 1&#xff09;、软件版本&#xff1a;MDK5.39 2&#xff09;、电脑环境&#xff1a;Ubuntu 20.04 LTS 3&…

【Eviews实战】——时序的平稳性检验

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

Microsoft OneDrive的10个常见问题及其解决方法,总有一种适合你

前言 Microsoft OneDrive是一个有用的工具,用于在线和跨多个设备备份和同步文件。然而,问题和冲突确实会发生。可能OneDrive突然停止工作,文件无法同步,项目被意外删除,或者同一文件的两个版本出现。然而,在你转到其他云存储服务之前,下面是如何解决这些(和其他)常见…

基于openresty构建运维工具链实践

本文字数&#xff1a;4591字 预计阅读时间&#xff1a;25 01 导读 如今OpenResty已广泛被各个互联网公司在实际生产环境中应用&#xff0c;在保留Nginx高并发、高稳定等特性基础上&#xff0c;通过嵌入Lua来提升在负载均衡层的开发效率并保证其高性能。本文主要介绍接口鉴权、流…

3款文章生成器,为创作者高效率自动写文章

在当今信息爆炸的时代&#xff0c;写作已经成为许多人不可或缺的技能。无论是从事新闻行业、营销领域&#xff0c;还是个人博客的作者&#xff0c;都需要不断地输出高质量的文字内容来吸引读者。然而&#xff0c;对于许多创作者来说&#xff0c;写作是一个耗时耗力的过程&#…

Python环境安装与配置(Windows环境)

Python目前已支持所有主流操作系统&#xff0c;在Linux,Unix,Mac系统上自带Python环境&#xff0c;在Windows系统上需要安装一下&#xff0c;超简单 一、下载Python 打开官网 Download Python | Python.org 下载中心&#xff0c;根据自己的系统和版本选择合适的安装包&#xf…

一款强大的去重工具,让文章快速过原创

今天要给大家分享的内容是一款强大的去重工具&#xff0c;可以帮助我们在创作的过程中让文章快速过原创检测&#xff01;我们都知道&#xff0c;在当今信息爆炸的时代&#xff0c;网络上充斥着大量的内容&#xff0c;原创性已经成为内容创作者们追求的重要目标之一。然而&#…

Postman-Installation has failed

如图&#xff1a; 解决方法&#xff1a; 打开文件夹 Postman-win64-Setup 点击Postman.exe 即可

【C++ 设计模式】策略模式与简单工厂模式的结合

文章目录 前言一、为什么需要策略模式简单工厂模式二、策略模式简单工厂模式实现原理三、UML图四、示例代码总结 前言 在软件设计中&#xff0c;常常会遇到需要根据不同情况选择不同算法或行为的情况。策略模式和简单工厂模式是两种常见的设计模式&#xff0c;它们分别解决了对…

SQLiteC/C++接口详细介绍之sqlite3类(三)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;四&#xff09; 6.sqlite3_create_module与sqlite3_create_module_v2函数…

Java爬虫-获取数据的方式之一

目录 一、jsoup的使用 1.概述 2.主要功能 3.快速入门 4.数据准备 二、Selenium 1.概述 2.使用 三、Selenium配合jsoup获取数据 四、爬虫准则 五、Seleniumjsoupmybatis实现数据保存 1.筛选需要的数据 2.创建一个表&#xff0c;准备存储数据 手写&#xff1f;不存在…

【JavaEE初阶系列】——多线程 之 创建线程

目录 &#x1f388;认识Thread类 &#x1f388;Sleep &#x1f388;创建线程 &#x1f6a9;继承Thread&#xff0c;重写run方法 &#x1f6a9;实现Runnable接口&#xff0c;重写run方法 &#x1f6a9;使用匿名内部类创建 Thread 子类对象 &#x1f6a9;使用匿名内部类&…

C++ vector详解及模拟实现

目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 2.vector深度剖析及模拟实现 3.迭代器失效 4.遗留的浅拷贝问题 5.完整代码 1.vector的介绍及使用 1.1 vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ScrollBar)

滚动条组件ScrollBar&#xff0c;用于配合可滚动组件使用&#xff0c;如List、Grid、Scroll。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 接口 ScrollBar(val…

MAC M芯片 Anaconda安装

Anaconda安装 1.M芯片下载AnaConda 1.M芯片下载AnaConda https://www.anaconda.com/download 安装完成 conda的版本是24.1.2

strcmp的模拟实现

一&#xff1a;strcmp函数的定义&#xff1a; strcmp函数功能的解释&#xff1a; 比较两个字符串的大小&#xff08;按照字符串中字符的ascll码值&#xff09;。 标准规定&#xff1a; 第一个字符串大于第二个字符串&#xff0c;则返回大于 0 的数字 第一个字符串等于第二个…