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

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

pFp8UCq.jpg

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

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

​ 所属专栏:C语言学习

​ 贝蒂的主页:Betty‘s blog

1. 什么是调试

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

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

2. Debug和Release

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

  1. Debug文件与Release文件(需要代码运行才生成)


通过观察我们可以知晓,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启动调试)

  1. 监视变量

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

4.2 内存

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

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

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

  1. 内存信息

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继续调试
    • 第二步没问题,F10继续调试
    • 第三步有问题
    • 增加变量继续分析

为什么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

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

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

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

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

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

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

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

图像演示如下

  • 原因:在该环境下,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开始调试

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

6. 编译器报错

6.1 编译型错误

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

6.2 链接型错误

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

6.3 运⾏时错误

运行时错误复杂多样,一般需要借助调试的手段才能发现

相关文章:

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

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; ​ 所属专栏&#xff1a;C语言学习 ​ 贝蒂的主页&#xff1a;Betty‘s blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预…...

yarn 安装包时报“certificate has expired”

在通过yarn包管理器安装 yarn install 时候 报错&#xff1a; info No lockfile found. [1/4] Resolving packages... error Error: certificate has expired at TLSSocket.onConnectSecure (node:_tls_wrap:1539:34) at TLSSocket.emit (node:events:513:28) at…...

Qt5项目拆解第一集解决:中文乱码| 全局字体|注册表|QSS/CSS

# 一、乱码解决代码片段 QTextCodec是Qt中用于处理文本编码和字符集转换的类。它提供了一系列静态函数来实现不同编码的文本转换,包括编码转换、字符集检测和转换、以及数据流中的文本编码处理。QTextCodec类使得Qt可以在不同的编码和字符集之间进行无缝转换,从而方便地处理…...

消息队列RabbitMQ.01.安装部署与基本使用

目录 RabbitMQ的作用 Message queue 释义 问题思考 存在的问题 优化方案 案例分析 带来的好处 消息队列特点 Email邮件案例分析 Docker安装部署RabbitMQ 1.下拉镜像 2.运行RabbitMQ 3.打开防火墙端口号并重新运行防火墙 4.容器启动后,可以通过 docker logs 容器 查…...

1.24号c++

C绪论 c是c语言的扩充&#xff0c;C包含了C的所有属性&#xff0c;换一句话说&#xff0c;C语言在C中都合法。 C语言编程思想&#xff1a;面向过程 c编程思想&#xff1a;面向对象 可以说在C中一切皆对象。 c的三大属性&#xff1a;封装&#xff0c;继承&#xff0c;多态。…...

【GitHub项目推荐--12 年历史的 PDF 工具开源了】【转载】

最近在整理 PDF 的时候&#xff0c;有一些需求普通的 PDF 编辑器没办法满足&#xff0c;比如 PDF 批量合并、编辑等。 于是&#xff0c;我就去 GitHub 上看一看有没有现成的轮子&#xff0c;发现了这个 PDF 神器「PDF 补丁丁」&#xff0c;让人惊讶的是这个 PDF 神器有 12 年的…...

React16源码: React中的PortalComponent创建, 调和, 更新的源码实现

PortalComponent 1 &#xff09;概述 React Portal之所以叫Portal&#xff0c;因为做的就是和“传送门”一样的事情render到一个组件里面去&#xff0c;实际改变的是网页上另一处的DOM结构主要关注 portal的创建, 调和, 更新过程 2 &#xff09;源码 定位到 packages/react-…...

Hive-SQL语法大全

Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法&#xff0c;在语法描述中出现&#xff1a; []&#xff0c;表示可选&#xff0c;如上[LOCATI…...

编译原理2.3习题 语法制导分析[C++]

图源&#xff1a;文心一言 编译原理习题整理~&#x1f95d;&#x1f95d; 作为初学者的我&#xff0c;这些习题主要用于自我巩固。由于是自学&#xff0c;答案难免有误&#xff0c;非常欢迎各位小伙伴指正与讨论&#xff01;&#x1f44f;&#x1f4a1; 第1版&#xff1a;自…...

JUC-CAS

1. CAS概述 CAS(Compare ans swap/set) 比较并交换&#xff0c;实现并发的一种底层技术。它将预期的值和内存中的值比较&#xff0c;如果相同&#xff0c;就更新内存中的值。如果不匹配&#xff0c;一直重试&#xff08;自旋&#xff09;。Java.util.concurrent.atomic包下的原…...

Effective C++——关于重载赋值运算

令operator返回一个*this的引用 在重载,,*等运算符时&#xff0c;令其返回一个指向this的引用。 class MyClass {int* val; public:MyClass(int i) : val(new int(i)){}MyClass():val(new int(0)){}void print() {cout << *val << endl;}MyClass& operator(co…...

vscode debug

需要对GitHub上的工程debug。 所以花时间看了下,参考了bili视频和chatgpt的解答。 chatgpt给的步骤 要在 VS Code 中调试 C++ 项目,可以按照以下步骤进行设置和操作: 确保已安装 C++ 扩展:在 VS Code 中选择 “Extensions”(或使用快捷键 Ctrl+Shift+X),搜索并安装官…...

数据库选型其实技术维度不太重要

看到这个标题可能觉得我在乱说&#xff0c;数据库选型要从多个角度和维度看来&#xff0c;还有各种POC。很多供应商朋友告诉我POC是一个漫长的过程&#xff0c;非常痛苦&#xff0c;要解决各种技术问题。怎么能说和技术无关呢&#xff1f; 因为从我的经历和周围听说的经验来说…...

【C++】入门(二)

前言&#xff1a; c基础语法&#xff08;下&#xff09; 文章目录 五、引用5.1 引用概念5.2 引用使用规则5.3 常引用5.4 引用的使用场景5.5 引用和指针的区别 六、内联函数6.1 概念6.2 内联函数的特性 七、auto关键字&#xff08;C11&#xff09;7.1 概念7.2 使用规则7.3 用于f…...

Nginx 代理服务路径带/和不带/的问题

nginx初始配置如下 server {listen 6087;location / {#网站主页路径。此路径仅供参考&#xff0c;具体请您按照实际目录操作。#例如&#xff0c;您的网站运行目录在/etc/www下&#xff0c;则填写/etc/www。#允许跨域请求的域&#xff0c;* 代表所有add_header Access-Control-…...

C# CefSharp 输入内容,点击按钮,并且滑动。

前言 帮别人敲了个Demo,抱试一试心态&#xff0c;居然成功了&#xff0c;可以用。给小伙伴们看看效果。 遇到问题 1&#xff0c;input输入value失败&#xff0c;里面要套了个事件&#xff0c;再变换输入value。后来用浏览器开发工具&#xff0c;研究js代码&#xff0c;太难了&a…...

历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!

本月&#xff0c;比特币庆祝了它的15岁生日&#xff0c;并以强势的姿态进军华尔街。最近美国交易所开始交易的比特币交易所交易基金&#xff08;ETF&#xff09;&#xff0c;已经获得了投资者的广泛接受。这一进展标志着比特币作为一种年轻资产迈向成熟的重要里程碑。 根据Glas…...

GBASE南大通用的接口程序GBase ADO.NET

GBase ADO.NET 是一个提供.NET 应用程序与 GBase 数据库之间方便、高效、 安全交互的接口程序&#xff0c;使用 100%纯 C#编写&#xff0c;并继承了 Microsoft ADO.NET 类。 开发人员可以使用任何一种.NET 开发语言&#xff08;C#、VB.NET、F#&#xff09;通过 GBase ADO.NET 操…...

算法训练营Day57(回文子串--总结DP)

647. 回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int countSubstrings(String s) {int len s.length();//i到j这个子串是否是回文的boolean [][] dp new boolean[len][len];int res 0;for(int i len-1;i>0;i--){for(int …...

使用OpenCV从一个矩阵提取子矩阵

介绍opencv的两个函数&#xff1a;Range()和Rect() Range()是用于表示一个范围的类。它的构造函数有两个整数参数&#xff0c;分别表示范围的起始和终止索引。这个范围包括起始索引但不包括终止索引。 cv::Range(int start, int end); /* 在OpenCV中&#xff0c;cv::Range() …...

[具身智能-190]:具身智能常见的仿真平台与常见的模型算法,包括传统算法与AI算法。

在具身智能的开发中&#xff0c;仿真平台与模型算法是相辅相成的两个核心部分。仿真平台为算法提供了安全、高效、低成本的“练兵场”&#xff0c;而算法则是赋予机器人智能的“大脑”。以下为你梳理当前主流的仿真平台以及两类核心的模型算法&#xff1a;传统算法与AI算法。&a…...

Qwerty Learner可扩展性设计:为未来功能预留空间的完整指南

Qwerty Learner可扩展性设计&#xff1a;为未来功能预留空间的完整指南 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https:…...

理视康新零售系统开发要点

业务模式设计新零售模式需整合线上线下渠道&#xff0c;构建会员体系、分销机制与数据中台。通过小程序、APP或H5实现线上商城&#xff0c;线下门店采用智能硬件&#xff08;如AR试戴、智能货架&#xff09;提升体验。结合LBS技术实现附近门店导流&#xff0c;支持到店自提或同…...

Qwen3-14B开源大模型实战:WebUI界面定制+API接口二次开发教程

Qwen3-14B开源大模型实战&#xff1a;WebUI界面定制API接口二次开发教程 1. 开箱即用的私有部署方案 Qwen3-14B作为通义千问最新开源的大语言模型&#xff0c;在14B参数规模下展现出惊人的多任务处理能力。但很多开发者在本地部署时常常遇到环境配置复杂、显存不足、推理速度…...

SAP BAPI实战指南:核心模块高频接口速查与应用解析

1. SAP BAPI入门&#xff1a;为什么开发者需要这份速查手册 第一次接触SAP BAPI时&#xff0c;我盯着满屏的接口文档差点崩溃——光是FICO模块就有二十多个常用BAPI&#xff0c;每个接口的参数列表长得像毕业论文。后来在项目上踩过几次坑才明白&#xff0c;BAPI的难点不在于技…...

Vue3+ECharts水球图实战:手把手教你打造个性化数据展示组件

Vue3与ECharts水球图深度整合&#xff1a;打造企业级数据可视化组件 在数据驱动的时代&#xff0c;可视化呈现已成为现代Web应用的核心竞争力。水球图&#xff08;Liquid Fill Chart&#xff09;作为一种直观展示百分比数据的可视化形式&#xff0c;在仪表盘、进度监控和数据看…...

GPEN技术白皮书精读:生成先验如何解决人脸超分病态逆问题

GPEN技术白皮书精读&#xff1a;生成先验如何解决人脸超分病态逆问题 1. 引言&#xff1a;从模糊到高清的AI魔法 你有没有遇到过这样的情况&#xff1f;翻看老照片时&#xff0c;发现那些珍贵的面孔已经模糊不清&#xff1b;或者用AI生成图片时&#xff0c;人脸总是出现奇怪的…...

3个步骤实现极致跨平台远程控制:BilldDesk Pro突破性体验

3个步骤实现极致跨平台远程控制&#xff1a;BilldDesk Pro突破性体验 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 还在为远程协作的种种限制而烦恼吗&#xff1f;当你需…...

Kimi-VL-A3B-Thinking效果展示:MMLongBench-Doc 35.1分超长文档理解

Kimi-VL-A3B-Thinking效果展示&#xff1a;MMLongBench-Doc 35.1分超长文档理解 1. 模型概述 Kimi-VL-A3B-Thinking是一款创新的开源混合专家&#xff08;MoE&#xff09;视觉语言模型&#xff0c;在多模态理解和长上下文处理方面展现出卓越能力。这个模型最引人注目的特点是…...

FLAC3D蠕变三轴压缩试验:博格斯摩尔本构应变时间曲线

FLAC3D蠕变三轴压缩试验&#xff1a;博格斯摩尔本构&#xff0c;应变时间曲线在岩土工程数值模拟里&#xff0c;蠕变试验就像给材料做"慢动作回放"。今天咱们拿FLAC3D折腾个博格斯摩尔&#xff08;Burgers-Malvern&#xff09;模型的蠕变三轴压缩试验&#xff0c;重点…...