VS的调试技巧

Visual Studioicon-default.png?t=N7T8https://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、内存


1、什么是调试?

当我们发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。 这个找问题的过程叫称为调试,英⽂叫debug(消灭bug)的意思。


调试⼀个程序,⾸先是承认出现了问题,然后通过各种⼿段去定位问题的位置,可能是逐过程的调 试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码, 重新测试。

 

 

2、debug和release

  • Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序; 程序员在写代码的时候,需要经常性的调试代码,就将这⾥设置为debug,这样编译产⽣的是debug 版本的可执⾏程序,其中包含调试信息,是可以直接调试的。
  • Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的, 以便⽤⼾很好地使⽤。当程序员写完代码,测试再对程序进⾏测试,直到程序员的质量符合交付给⽤ ⼾使⽤的标准,这个时候就会设置为release,编译产⽣的就是release版本的可执⾏程序,这个版本是 ⽤⼾使⽤的,⽆需包含调试信息等。 

简单来说,Debug版本是程序员使用的版本,进行调试和修复,而Release版本是当程序员写完代码,并且代码符合质量标准后,进行上交的版本,也就是最后用户使用的版本,同时Release版本是无法进行调试和修改的。 

 

且二者的最大不同之处就在于存储在电脑磁盘中的内存空间并不一致,Release存储的更小,而Debug存储的更大。 

3、调试

3.1、环境

调试的环境,在调试代码之前,必须先进行环境的改变,也就是先将编译器的变为debug的版本环境,而X86和X64环境并无大碍。

3.2、 快捷键

VS中常用的快捷键:http://t.csdn.cn/Gjfmi

3.2.1、F10和F11

介绍:

  • F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。
  • F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。 

区别:

 

如以上代码:

  • 若使用F10进行调试,根据F10的调试原理,在调试到调用函数test()时,F10会直接越过,并得出结果,随后立即跳往下一个语句,for()
  • 而,若使用F11进行调试,根据F11的调试原理,在调试到调用函数test()时,F11会进入test中,通过调用函数,抵达void test()并开始调试里面的每一个语句,待调试完里面的所有语句后,在跳回原来的test()之后的语句。 

结论:在函数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。 

3.2.2、ctrl+F5

ctrl+F5 开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。

3.2.3、F5与F9

介绍:

  • F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是 和F9配合使⽤。
  • F9:创建断点和取消断点 断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂定执 ⾏,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执行细节。 

注意:

F5在没有配合F9的使用时,就和Ctrl+F5毫无区别(最新的VS2020版本),甚至是一闪而过。 

 作用:

F9的是用于在有可能出现问题的地方使用,配合F5,可以使调试变得更加的简便和轻松。

譬如:

如以上代码:

在得知错误点在for语句时

  • 若在for循环开始的那一行中摁下F9,设置断点,而后在摁下F5,那么在for之前的代码语句将会快速进行调试,随后抵达F9的所在位置。
  • 而若没有使用该功能,我们想要查询for语句中的错误,只能使用F10或者F11进行逐行的代码调试,效率极其低下。 

 3.2.3.1、条件断点

条件断点:满⾜这个条件,才触发断点

 

在进行条件断点之前,我们先了解一下断点。

如以上代码,有两个断点,分别是第18行和第23行。

那么在18行的断点结束后,摁下F5,跳往的是第23行的断点,还是?

 答案并不是第23行的断点,而是下一处循环的断点。

for语句,是一个循环语句,在循环未结束之前,是不会停下,而设在for语句循环体内的断点也是如此,当一次循环的断点结束后,摁下F5飞往的是下一次循环的断点,直到循环结束!

这也是断点的一个特点,断点是逻辑断点,并非物理表面上的物理断点! 

条件断点:


 如以上代码,有这样一个疑问,如果我知道了某一次循环会出错,但是我要知道那一次循环具体出错的原因,那么我该怎么办?应该是在循环语句中不断的使用F11进行内部循环的调试,调试到那一次循环位置,还是说?

于是乎,当我们遇到这类问题时,我们就可以将断点设置为条件断点进行调试。

条件断点的原理是只有满足改条件时,循环便会中断,且之前进行的循环过程会被快速调试。 

如何设置:

摁F9设置断点——>右击断点——>选择“条件”——>设置条件——>回车 

3.3、监视和内存观察

在调试的过程中我们,如果要观察代码执⾏过程中,上下⽂环境中的变量的值,有哪些⽅法呢?

3.3.1、监视

开始调试后,在菜单栏中【调试】->【窗⼝】->【监视】,打开任意⼀个监视窗⼝,输⼊想要观察的对 象就行。

打开监视窗口:

 注意:只有在进行调试后(摁下F10),才能点击窗口右侧选项栏内的监视,否则会没有任何东西出现。

 且,在监视栏中,输入的对象必须是合法对象,也就是在代码中合理的表达式或者变量,否则会没有任何东西出现。

3.3.2、内存

 如果监视窗⼝看的不够仔细,也是可以观察变量在内存中的存储情况,还是在【调试】——>【窗⼝】——> 【内存】

打开内存窗口:

在内存窗⼝中观察数据: 

 

第一行表示内存地址,第二行表示内存中的十六进制展示,第三行表示内存数据的解析。

 

在打开内存窗⼝后,要在地址栏输⼊:arr,&num,&c,这类地址,就能观察到该地址处的数据。 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[集创赛海云捷讯杯]全国二等奖经验分享

[集创赛海云捷讯杯]全国二等奖经验分享 一.前言二.我们的作品三.小结 一.前言 笔者是研一在校生,从五月份开始和本科生一起卷集创赛,经历初赛,分赛区决赛,全国总决赛,认识了很多一起做比赛的朋友收获颇丰。今年海云杯…

RabbitMQ工作模式-发布订阅模式

Publish/Subscribe(发布订阅模式) 官方文档: https://www.rabbitmq.com/tutorials/tutorial-three-python.html 使用fanout类型类型的交换器,routingKey忽略。每个消费者定义生成一个队列关绑定到同一个Exchange,每个…

性能测试jmeter连接数据库jdbc(sql server举例)

一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现。 (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包,也有jdbc取样器,但不能发…

外观模式:简化复杂子系统的访问与使用

文章目录 1. 简介2. 外观模式的基本结构3. 外观模式的实现步骤4. 外观模式的应用与实例4.1 图形界面库的外观模式应用4.2 文件压缩与解压缩的外观模式应用4.3 订单处理系统的外观模式应用 5. 外观模式的优缺点5.1 优点5.2 缺点 6. 总结 1. 简介 外观模式是一种结构型设计模式&…

Linux服务器安装部署MongoDB数据库 – 【无公网IP远程连接】

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 前言 MongoDB是一个基于分布式文件存储的数据库。由 C 语言编写,旨在为 WEB 应用提供可扩展的高…

什么是OLAP

一、什么是OLAP OLAP(On-line Analytical Processing,联机分析处理)是在基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合。可以比较下其与传统的OLTP(On-line Transaction Processing,联机事务处理&…

Redisson分布式锁 原理源码 分析

# 基于setnx实现的分布式锁存在的问题: # 为了解决上面的问题,可以用Redisson # Redisson入门 # Redisson可重入锁原理 获取锁的Lua脚本: 释放锁的Lua脚本: # 锁重试原理分析 tryLock()底层代码分析 tim…

什么是自动语音识别?

在人工智能发展和全球疫情的双重作用下,企业加强了与客户的线上沟通。企业越发依赖于虚拟助手、聊天机器人以及其他的语音技术,以实现与客户的高效互动。这几类人工智能,都是依赖于自动语音识别技术,简称为ASR。ASR涉及到将语音转…

LLM推理部署(一):LLM七种推理服务框架总结

自从ChatGPT发布以来,国内外的开源大模型如雨后春笋般成长,但是对于很多企业和个人从头训练预训练模型不太现实,即使微调开源大模型也捉襟见肘,那么直接部署这些开源大模型服务于企业业务将会有很大的前景,本文将介绍七…

Effective C++条款16——成对使用new和delete时要采取相同形式(资源管理)

以下动作有什么错? std::string* stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序。使用了new,也搭配了对应的 delete。但还是有某样东西完全错误:你的程序行为不明确(未有定义)。最低限度&#xff…

PHP竞赛管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 竞赛管理系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88244066 二、功能介绍 后…

C#_特性反射详解

特性是什么? 为程序元素额外添加声明信息的一种方式。 字面理解:相当于把额外信息写在干胶标签上,然后将其贴在程序集上。 反射是什么? 反射是一种能力,运行时获取程序集中的元数据。 字面理解:程序运行…

一键实现 Oracle 数据整库同步至 Apache Doris

在实时数据仓库建设或迁移的过程中,用户必须考虑如何高效便捷将关系数据库数据同步到实时数仓中来,Apache Doris 用户也面临这样的挑战。而对于从 Oracle 到 Doris 的数据同步,通常会用到以下两种常见的同步方式: OGG/XStream/Lo…

设计模式-桥接模式

核心思想 适配器模式类似,以后也会遇到意思接近一样的设计模式。在开发中一般多个模式混用,且根据不同的场景进行搭配,桥接模式也是结构型模式将抽象的部分和实现的部分分离,使它们都可以独立的变化。通俗来说,就是通…

Linux特殊指令

目录 1.dd命令 2.mkfs格式化 3.df命令 4.mount实现硬盘的挂载 5.unshare 1.dd命令 dd命令可以用来读取转换并输出数据。 示例一: if表示infile,of表示outfile。这里的/dev/zero是一个特殊文件,会不断产生空白数据。 bs表示复制一块的大…

vscode 对模型train、detect脚本进行Debug时配置参数

我们训练yolov5代码时,一般会配置一些参数,比如模型权重文件--weights, 模型的配置文件--cfg, 以及训练的数据--data, 对应的训练脚本为: 训练train python train.py -- weights ./yolov5s.pt --cfg models\yolov5s.yaml --data ./data/coco128.yaml…

9.oracle中sign函数

在Oracle/PLSQL中, sign 函数返回一个数字的正负标志. 语法如下&#xff1a;sign( number ) number 要测试标志的数字. If number < 0, then sign returns -1. If number 0, then sign returns 0. If number > 0, then sign returns 1. 应用于: Oracle 8i, Oracle …

Docker - Docker安装MySql并启动

因为项目需要连接数据库&#xff0c;但是远程服务器上的mysql我不知道账户和密码&#xff0c;这个时候便是docker发挥作用的关键时刻了&#xff01; 目录 docker安装安装gcc卸载老docker&#xff08;如有&#xff09;安装软件包设置镜像仓库更新yum软件包索引安装docker启动doc…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第五天&#xff09;MyBatis的注解开发 ​ 昨天我们深入学习了MyBatis多表之间的关联映射&#xff0c;了解掌握了一对一关联映射&#xff0c;一对多关联映射&#xff0c;嵌套查询方…

微信小程序如何实现页面传参和页面传递多个参数

前言 只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递&#xff0c;下面我总结了 4 种页面方法。 下面时多个参数页面传参的方式 let loveJSON.stringify(this.data.totle);let youJSON.stringify(this.data.totleId)let csdnJSON.stringify(this.data.totleP…