学会这些常用调试技巧,让你的C/C++代码调试起来如虎添翼

news2024/10/1 8:12:42

本篇博客主要讲解程序员最应该掌握的技能之一——调试。我个人认为,学习编程,有2件事情非常重要,一是画图,一是调试。下面我会以Visual Studio 2022为例(VS的其他版本大同小异),演示如何调试一个C/C++代码。

在这里插入图片描述

快捷键

常用的快捷键一定要记住!主要有以下4个:

  1. F9打断点,配合F5开始调试。
  2. F10逐过程,F11逐语句。

如果愿意记忆的话,可以再记2个:

  1. ctrl+F5,开始执行,不调试。
  2. shift+F5,结束调试。

以上4+2个快捷键,如果大家使用VS2022编写C/C++代码,希望能够牢牢记住,反复使用。我每次使用这几个快捷键,都是手指往那个方向一按,都形成肌肉记忆了。

下面依次讲解这几个键的作用。

先讲最简单的,ctrl+F5,你只要一按下,程序就开始执行了。注意这个快捷键并不能调试,它只是单纯的执行你的代码。

在这里插入图片描述
如果你想要调试要怎么办呢?一个标准的流程是:

先设置断点。你也可以在调试起来后,再设置。设置断点的方式很简单,用鼠标点到你想设置断点的那一条语句上,然后按F9。比如:
在这里插入图片描述
我用鼠标点到了15行上,然后按了F9,就可以看到15行上出现了一个红点,说明设置断点成功了。

断点有什么用呢?当你调试起来后,每次执行到断点处,就会停下来。而按F5就可以开始调试。我按一个F5:
在这里插入图片描述
可以看到代码直接执行到了第15行,由于遇到了断点,就停了下来。再看看输出窗口:
在这里插入图片描述
此时只执行了“打印1~10”这个逻辑。

那如果我想继续向下执行呢?你每按一下F10,就会执行一条语句。

先按一下F10:
在这里插入图片描述
代码执行了第15行的语句,在屏幕上打印了“a = 10, b = 20”,即将执行第16行语句。注意,左边的“箭头”表示的是即将执行的语句。

再按一下F10:
在这里插入图片描述
再按一下F10:
在这里插入图片描述

那F10和F11有什么区别呢?在绝大多数情况下是没有区别的,但是遇到函数调用语句时,按F10会直接执行完这条语句,是不会进入这个函数的。但是F11会进入函数。举个例子:

对于以下代码,我先在第17行打个断点:
在这里插入图片描述
然后按F5执行到这个断点处:
在这里插入图片描述
此时我有2种选择:第一种,按F10,就会直接执行函数调用,代码会来到第18行:
在这里插入图片描述
重新开始一次调试,此时在相同的情况下,我按F11,就会直接进入Print函数内部:
在这里插入图片描述
这样就可以观察Print函数内部的执行细节。

最后说一下,如果你想停止调试,就按shift+F5:
在这里插入图片描述
可以看到,这个进程直接被干掉了。

信息窗口

光知道如何让代码执行到想要的位置是不够的,还要能够观察一些细节,比如变量的值、函数的调用逻辑、内存中的值等等,这就需要用到信息窗口。主要的信息窗口有(这里只列举我最常用到的):

  1. 监视窗口,用于观察变量和表达式的值。
  2. 内存窗口,用于观察内存中的值。
  3. 调用堆栈窗口,用于观察函数之间的调用逻辑。

在这里插入图片描述
这些窗口都可以在调试起来后在调试–>窗口中找到。其他的窗口都有他们独特的用处,大家可以自行摸索。其实,我选择VS系列来讲解调试的一个重要原因,就是因为它好上手,很容易调试代码。如果使用gdb等工具来调试代码,不适合新手入门,而且很不方便。

先说监视窗口,这里可以监视各个变量和表达式的值:
在这里插入图片描述
而内存窗口可以观察内存,比如观察a在内存中的分布:
在这里插入图片描述
最后再提一下调用堆栈,可以观察函数的调用逻辑,比如:
在这里插入图片描述
可以观察到,main函数调用test1,test1调用test2,test2调用test3。

总结

  1. 说一千道一万,大家一定要多动手调试!调试!调试!!!
  2. 常用的快捷键有F9, F5, F10, F11, ctrl+F5, shift+F5等等。
  3. 如果要让一个程序运行起来,不调试,按ctrl+F5。
  4. 一般来说,会先使用F9打断点,再按F5,程序就会开始执行,直到遇到断点或者程序结束时就停下来。
  5. 如果想逐过程执行,按F10,就会执行下一条语句,遇到函数不会进入函数。
  6. 如果想逐语句执行,按F11,就会执行下一条语句,遇到函数会进入函数。
  7. 常用的信息窗口有:监视窗口、内存窗口、调用堆栈窗口,分别用来观察变量和表达式的值、观察内存中的值、观察函数之间的调用逻辑。
  8. 最后再提一遍:动手调试!!!

感谢大家的阅读!

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

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

相关文章

怎么体验gpt4-国内怎么使用chatGPT

gpt4api要等多久 目前,OpenAI尚未公布GPT-4 API的发布计划和时间表。GPT-4 将是前置还增加强大的自然语言处理能力和推理能力,OpenAI正在为其开发和研究,以使其更加流畅、准确和智能。因此,GPT-4 API的发布时间尚未确定。但是&am…

云原生Istio安装和使用

目录 1 Kubernetes集群环境2 安装Istio2.1 快速部署Istio2.2 回顾K8S组件以及使用2.2.1 Deployment2.2.2 Labels and Selectors2.2.3 Namespace2.2.4 Service2.2.5 Ingress 2.3 初步感受istio2.4 手动注入2.5 自动注入sidecar 1 Kubernetes集群环境 Istio支持在不同的平台下安装…

华为OD机试真题(Java),计算字符串的编辑距离(100%通过+复盘思路)

一、题目描述 Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由…

STM32CubeMX时钟树配置详解(F103)

外部时钟配置 学习时使用的是stm32f103系列芯片,文档的时钟树属实不适合新手阅读,STM32cube的功能很强大,时钟树清晰明了: 首先我们要知道,芯片需要一个频率来进行工作,通常选用的是晶振来提供工作频率&a…

数据存储系统概要

可靠、可扩展与可维护性 现在有很多都属于数据密集型,而不是计算密集型。对于这些类型应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量、数据的复杂度及数据的快速多边形。 数据密集型应用模块: 数据库:存…

不会JVM调优怎么进互联网大厂

📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 &#x…

设计模式七大设计原则

文章目录 1、什么是设计模式2、单一职责原则3、开闭原则4、接口隔离原则5、依赖倒置原则6、迪米特法则(最少知道原则)7、里式替换原则8、组合优于继承 设计模式主要是为了满足一个字 变,这个字,可能是需求变更、可能是场景变更&a…

【VAR | 时间序列】以美国 GDP 和通货膨胀数据为例的VAR模型简单实战(含Python源代码)

以美国 GDP 和通货膨胀数据为例: 1. 数据集 下载数据我们需要从 FRED 数据库下载美国 GDP 和通货膨胀数据,并将它们存储在 CSV 文件中。可以在 FRED 网站(https://fred.stlouisfed.org/)搜索并下载需要的数据。在这里&#xff0…

非静压模型SWASH学习(7)——自制算例Lock-Exchange

自制算例Lock-Exchange 算例简介模型配置网格及参数设置网格与地形初始条件与边界条件物理参数设置数值求解方法模型输出计算时间 模拟结果 SWASH是由Delft大学开发,用于模拟非静压条件下的水动力/波浪运动的数值模型。 与模型原理相关的内容详见以下论文&#xff1…

Centos系统安装RabbitMQ消息中间件

记录一下在centos7.x下面安装RabbitMQ消息中间件 RabbitMQ是一个开源而且遵循 AMQP协议实现的基于 Erlang语言编写,因此安装RabbitMQ之前是需要部署安装Erlang环境的 先安装Erlang https://packagecloud.io/rabbitmq/ 点进去可以看到 因为使用的centos是7.x版本的…

内网渗透(六十二)之 NTLM Realy 攻击

NTLM Realy 攻击 NTLM Realy 攻击其实应该称为Net-NTLM Realy 攻击,它发生在NTLM认证的第三步,在Response 消息中存在Net-NTLM Hash,当攻击者获得了 Net-NTLM Hash 后,可以重放Net-NTLM Hash 进行中间人攻击。 NTLM Realy 流程如图所示,攻击者作为中间人在客户端和服务器…

asp.net基于web的音乐管理网站dzkf17A9程序

本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块:管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块:用户登录本系统,对个…

如何免费使用ChatGPT进行学术润色?你需要这些指令...

目录 1 ChatGPT4.0上线2 中科院ChatGPT学术版3 学术润色Prompts 1 ChatGPT4.0上线 2023年3月14日,OpenAI发布ChatGPT4.0。ChatGPT4.0比3.5更大,拥有更多的参数。这意味着它可以更好地捕捉和理解语言的复杂性和细微差别,而且ChatGPT4.0是多模…

【五一创作】《嵌入式系统》知识总结6:GPIO的结构和功能

GPIO的结构和功能 1.STM32提供通用的输入输出引脚(GPIO) • 输出高低电平控制外设 • 输入0、1检测外设状态 2.可配置为复用的输入输出引脚(AFIO) • 大多数GPIO都有默认的复用功能: 可作为片上外设(如…

基于MobileNet的人脸表情识别系统(MATLAB GUI版+原理详解)

摘要:本篇博客介绍了基于MobileNet的人脸表情识别系统,支持图片识别、视频识别、摄像头识别等多种形式,通过GUI界面实现表情识别可视化展示。首先介绍了表情识别任务的背景与意义,总结近年来利用深度学习进行表情识别的相关技术和…

android基础知识

架构: 应用框架层(Java API Framework)所提供的主要组件: 名称功能描述Activity Manager(活动管理器)管理各个应用程序生命周期,以及常用的导航回退功能Location Manager(位置管理器…

智能是逻辑吗?

智能是指人或机器能够理解、学习、推理、解决问题和适应环境的能力。而逻辑是一种推理方式,它是智能中的一部分,帮助我们正确地推理和理解信息。逻辑能够提高我们的思考能力、解决问题的能力和决策能力,但智能还包括其他方面,如感…

数据结构课程——第一次作业

T1:Gram_ham实现凸包算法&#xff1a; &#xff08;1&#xff09;思路&#xff1a; &#xff08;2&#xff09;代码&#xff1a; #include<iostream> #include<string> #include<vector> #include<algorithm> #include<stack>using namespace …

存储网络架构——DAS、NAS、SAN、分布式组网架构

目录 DAS直连式存储 NAS网络附加存储 SAN存储 存储区域网络 分布式存储组网 DAS直连式存储 DAS遇到的挑战 NAS网络附加存储 向主机提供文件服务&#xff1b;文件系统由存储设备维护&#xff0c;用户访问文件系统&#xff0c;不直接访问底层存储 拥有所有主机上文件与底层存储空…

图像复原与重建

文章目录 一、实验目的二、实验内容1. 噪声图像及其直方图。2. 空间噪声滤波器。3. 逆滤波。 一、实验目的 了解一些常用随机噪声的生成方法。掌握根据指定退化函数对图像进行退化的方法。掌握当模糊图像只存在噪声时的几种滤波复原方法。掌握当模糊图像同时存在线性退化和噪声…