编程技能:调试02,设置断点与删除断点

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:编程技能:调试01,调试介绍

回到目录

下一篇:无

(二)MFC 专栏导航

上一篇:编程技能:调试01,调试介绍

回到目录

下一篇:无

本节前言

在上一节,我们简单地介绍了一下调试的概念。

对于调试这一块,单凭着一点概念,应该还是很难理解其含义的。这一块,我认为,它是需要你在实践中,逐渐地来积累经验与提升技能的。

本专栏所讲解的调试知识,是作为一个入门,来教大家几条基本的调试指令。

本节,我们要教大家的是【开始调试】指令,【继续】命令和【切换断点】指令。

标题中,说的不是设置断点与删除断点吗?没有讲【切换断点】啊?其实,【切换断点】在不同的时机,分别等价于设置断点和删除断点。我们在讲解具体的知识的时候,大家应该就能理解了。

一.    本节代码

来看一下本节所用到的代码。

#include <stdio.h>int calcu01(int x, int y);
int calcu02(int x, int y);
int calcu03(int x, int y);int main(void)
{int a, b, res01, res02, res03;int res;a = 10;b = 20;a++;res01 = calcu01(a, b);res02 = calcu02(a, b);res03 = calcu03(a, b);res = res01;res += res02;res += res03;return 0;
}int calcu01(int x, int y)
{int res;res = x + y;res += x;res *= y;return res;
}int calcu02(int x, int y) 
{int res;res = 2 * x;res *= y;res += y;return res;
}int calcu03(int x, int y)
{int res;res = x * x * x;res -= y;res /= y;return res;
}

这就是本节所用到的代码了。代码的行数有点多,不过,并不难。相信大家很容易理解其功能。

为了方便查找和使用,我将这样的代码放在了 win32 专栏与 mfc 专栏的 Gitee 代码仓库里面了。网址如下所示。

Gitee 网址:Win32 教学课件

Gitee 网址:MFC 教学课件

两个代码仓库里面,关于本节所述的调试案例代码的路径,都是一样的。

在正式使用 Gitee 的功能之前,你可能会需要首先注册账号,如果还没有注册过 Gitee 的账号的,你可以前往下面的两个链接所示的文章,了解 Gitee 的基本使用方法。

WIn32 笔记:本专栏课件-CSDN博客

MFC笔记:本专栏课件-CSDN博客

在了解了 Gitee 的基本使用方法的前提下,你可以点击如下所示的两个链接之一。

Gitee 网址:Win32 教学课件

Gitee 网址:MFC 教学课件

点开了链接以后,来到如下所示的页面,在这里,我以 MFC 专栏课件的页面为例。

图1

在写作本节文章的时候,我还没有往代码仓库里面传入多少代码,所以,图1中的项目很少。等到你看到本篇文章的时候,很有可能,里面的代码已经是很多很多了。

我们在网页中找到红色框线所示的文件夹,单击进入这个文件夹,结果如下图所示。

图2

在我写作本文的时候,只在【调试案例代码】文件夹里面传入了【code1.c】一个源文件。等到你学习本篇内容的时候,有可能,我已经新增了一点源文件。别管新增了多少,你需要找到的,是这个【code1.c】,找到了它以后,单击它,然后呢,结果如下图所示。

图3

这是 Gitee 里面展示的部分的调试案例代码,图3中的部分代码,与本节的代码块中的代码是一样的。

你可以将代码仓库给下载回去,并在相应的路径中,找到【code1.c】。

到了这里,本节所使用的调试案例代码的获取方法,我就讲完了。我接着往下讲。

二.    建立工程

请大家自行建立 C/C++ 项目,最好是使用 VS2019 来建立项目。

如果还不会用 VS2019 来建立 C/C++ 项目的话,请参考如下链接所示的文章。

Windows编程:用 VS2019 编写C语言程序-CSDN博客

在本节,我需要你将第一分节中的代码块中的代码,设置为 C/C++ 项目中的 main.c 中的源代码。并自行编译生成。

三.    【开始调试】命令

在 VS2019 的【调试】菜单下面,有一个【开始调试】命令,如下图所示。

图4

之前,我们在编译好了项目代码以后,我们是使用【调试】菜单下面的【开始执行(不调试)】命令,来运行解决方案的。

在这里,我们尝试着点击【调试】,【开始调试】命令,来运行一下解决方案。

图5

结果如图5所示。其实,此刻,【开始调试】和【开始执行(不调试)】的执行效果差不多,都是说,连续运行程序中的所有的代码行,弹出来一个黑窗口,一口气执行完毕。

这是因为,此时,我们尚未设置断点。如果设置了断点的话,那么,情形就会有所不同了。

请大家关闭图5 所示的窗口。

接下来,先不要关闭解决方案,我们在下一分节有用。

在进行下一分节之前,请大家记住一件事,那就是,在图4里面,【开始调试】命令右边的快捷键,F5 。记住它。

四.    设置断点

请大家点击一下代码中的行号为15 的代码中的某一个位置,让光标停在 15 行的某一个位置上,如下图所示。

图6

在图6 的红色框线所示的区域里面,包含有文本光标。其实这个东西,在Windows编程里面,它被称作文本插入符。以后,我们也会讲解文本插入符的编程方法。

在将文本光标设置在 15 行以后,大家依次点击【调试】,【切换断点】菜单命令,过程如下图所示。

图7
图8

在图7里面,【切换断点】字样的右边,给出了这个命令的快捷键,F9 。这个快捷键,也请大家记住它。当然了,记不住的话,只要你还记得菜单命令的路径,那么,多看几次,你也就能记住这个快捷键了。

添加断点的一个方法是,首先点击想要设置断点的某一文本行,使得文本光标停在断点所在的代码行里面,然后呢,依次点击【调试】,【切换断点】命令,然后呢,这一代码行的左边就会出现红色实心圆点了,表明这一行设置了断点。

添加断点的另一个方法是,首先点击想要设置断点的某一文本行,使得文本光标停在断点所在的代码行里面,然后按下功能键 F9,也可以在这一代码行上面设置断点。

某一代码行设置了断点的标志是,这一代吗行的左边出现了红色的圆点。

在图8 里面,我们看到,在我们执行了【切换断点】菜单命令以后呢,在行号 15 的左边,出现了一个圆形的实心红点。出现了这个东西,就表示说,此时,我们在行号 15 的位置,设置了一个断点。

当我们在 15 行设置了断点以后,我们再次执行【调试】,【开始调试菜单命令】,结果如下图所示。

图9
图10

在图9里面,它没说【某某程序已退出】,那就是说,程序并未像图5那样子,全部执行完并退出。实际上,此时,程序是停在了代码中的 15 行的位置。

为啥说,此时,程序停在了15行的位置呢?

我们看一下图10,在图10 中,我们看到,在断点标记的中间,有一个黄色填充的箭头符号。这个黄色箭头符号指向的是哪一行,就表示程序停在了哪一行代码上面。

注意,这里所说的程序停在某一行,它是说,这一行尚未执行,而它之前的代码已经是执行完了。

在本案例中,它是说,第 15 行上面的代码,13,14行等等的代码,均已执行完毕,程序即将执行15行,而尚未执行15行的代码。

断点的功能,就是让程序在连续执行期间,遇到了断点以后,就停下来。

让连续运行的程序,停在某一个位置,断开连续执行的状态,停下来。那么,这个停下来的站点,就叫做断点。

在 VS2019 里面,断点会用红色的圆点来标记。

程序停在断点上以后,接下来,它会等候我们的调试指令。此时,我们再来尝试着去执行【调试】,【开始调试】菜单命令。如下图所示。

图11

此时,我们在【调试】菜单里面找不到【开始调试】这一子菜单项了,然而,我们可以见到【继续】这一项。在之前,我们让大家记过一个知识点,【开始调试】的快捷键是 F5,而图11 中的【继续】命令的快捷键也是 F5 。

个人觉得,其实【开始调试】命令和【继续】命令是一回事,都是说,让程序连续运行,直到遇到了断点,才停下来。

但是呢,在不同的场合,快捷键 F5 所对应的名称却是不一样的。当程序尚未启动调试的时候,那么,【调试】菜单项下面,会显示着【开始调试】命令。而当我们点击过【开始调试】,启动了调试运行的命令以后,假定程序停在了某一个断点上,那么,这回,【调试】菜单下面,就会显示有【继续】命令,而不是显示【开始调试】命令了。

接下来呢,我们依次点击【调试】,【继续】命令。过程如下。

图12
图13
图14

图13 和图14 的红色框线标记的位置,都显示了【已退出】字样,表明程序执行完毕,已退出。

请大家关闭图14 所示的黑窗口。

程序在停在了 15 行上的断点以后,我们点击了【调试】,【继续】命令以后,程序会执行到退出,这是因为,此时,我们在程序中,仅仅设置了 15 行这一个断点而已。如果,我们再多设置几个断点,程序就不会那么快地退出了。

这回呢,我们添加几个断点,让程序慢点退出。

我们在程序的第17行和第21行分别设置断点,如下图所示。

图15

这回呢,我们来执行【调试】,【开始调试】菜单命令,预计,程序会停在15行的位置,程序的执行情况如下所示。

图16

果然啊,第15行的断点上,出现了黄色箭头。

接下来,我们执行一次【继续】命令。不过,这一次,我们不采用菜单命令的方式,而是采用快捷键的方式。【调试->继续】命令的快捷键是 F5,我们按下 F5,观察执行效果,结果如下。

图17

看到了没?这回,黄色小箭头停在了 17 行的位置了。这表明,此时,程序停在了第17行上面,第17行尚未执行。

我们再按一次 F5,结果如下。

图18

如图18 所示,黄色小箭头出现在了第 21 行的断点上面。这是本程序的执行流程中的最后一个断点了。

既然是最后一个断点,那么,再次按下 F5 键,那么,程序就该退出了。我们按一下 F5,结果如下。

图19
图20

如图19 和图20 所示,程序果然是退出了,并且呢,程序代码中,不存在黄色小箭头了。

我们关闭程序执行用的黑窗口。

到了这里,【开始调试】,【继续】,F5,这几个命令,我就算是讲完了。

接下来,我们来看一看,如何删除断点。

五.    删除断点

如何来删除断点呢?

请大家来跟我一起操作。首先呢,我们点击一下代码区域的第 15 行的某一个地方,使得文本光标停在第 15 行里面,如下图所示。

图21

接下来呢,请大家依次点选【调试】,【切换断点】菜单命令,结果如下。

图22

看到了没?图21 里面,15行的左边还有断点标记的,而到了图22 里面,断点标记就没有了。

当某一行原本已经设置了断点的情况下,我们先将文本光标定位在这一断点所在行上面,然后执行【调试->切换断点】命令,就会删除这一行的断点。

我们再来试着用另一种方法删除断点。

首先呢,点击 17 行的某一个位置,使得文本光标定位在 17 行,如下图所示。

图23

然后呢,请大家按下 F9,结果如下。

图24

,如图24所示,17 行上的断点标记被删除了。

我们之前让大家记忆过,【调试->切换断点】的快捷键是 F9 。这一次,我们正是用快捷键 F9,取代了【调试->切换断点】菜单命令。

这样一来,设置断点和删除断点的方法,我就都讲完了。

六.    切换断点的简易方法

我再来讲解一下切换断点的简易方法。

此时,在程序中,还剩下21行一个断点了。

在代码行号的左边,有一个竖着的,很窄灰色的区域,如下图所示。

图25

当我们点击这一区域时,鼠标点击的位置的水平方向上,位于哪一个代码,哪一个代码行就会相当于执行了一次【调试->切换断点】菜单命令。

我们点击一下 21 行左边的窄灰色区域,结果如下图所示。

图26

我们再来点击一下 20 行左边的窄灰色区域,结果如下图所示。

图27

这样一来,20行就设置了断点。

切换断点命令,它的效果是,如果某一代码行原本没有断点,则执行这一命令,会设置断点。如果某一代码行原本是有断点的,则执行这一命令会删除该行断点。

我们再来设置几个断点,如下图所示。

图28

如图 28 所示,我设置了 4 个断点。在实际项目中,我们可能会设置更多的断点。

假定我们想要删除所有的断点。该怎么办呢?

我们当然可以一个一个地删除断点。然而,我们还可以采用更省事的方法。

请大家跟我做,依次点击【调试】,【删除所有断点】菜单项,过程如下图所示。

图29
图30

在图30 里面,我们点击 【是】,结果如下图所示。

图31

如图31 所示,这回呢,我们所设置的 4 个断点,就被一次性地清除了。

结束语

本节知识,应该是不难的。只是,篇幅大了一点。

希望大家能够学好本节知识。

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:编程技能:调试01,调试介绍

回到目录

下一篇:无

(二)MFC 专栏导航

上一篇:编程技能:调试01,调试介绍

回到目录

下一篇:无

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

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

相关文章

flink写doris时的优化

1.概念 doris并不擅长高频、小量数据的导入&#xff1b; 因为doris每一次数据导入都会在be节点上生成数据文件&#xff1b;如果高频导入小量数据&#xff0c;就会在存储层产生大量的小文件&#xff08;必然会影响到后续的查询效率&#xff0c;也会对系统产生更多的compaction…

ElementNotInteractableException原因及解决办法

在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…

如何从 GitHub 镜像仓库到极狐GitLab?

最近 GitHub 封禁中国用户的事情闹得沸沸扬扬,虽然官方发布的报道说中国用户被限制登录是因为配置错误导致,已经撤回了更新,中国用户已经可以正常使用。但是这就像横在国内开发者和企业头上的“达摩克利斯之剑”。为了避免 GitHub 不可用而带来的影响,国内开发者和企业可以…

服务器安装nacos

1.下载依赖 docker pull nacos/nacos-server:v2.4.3安装 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服务的文件夹 docker cp nacos-server:/home/nacos/data /home/admin1/…

Matter协议暗战:苹果、谷歌、亚马逊的智能家居霸权争夺

原文地址&#xff1a;Matter协议暗战&#xff1a;苹果、谷歌、亚马逊的智能家居霸权争夺 一、Matter 协议&#xff1a;巨头联手打造的 “智能家居联合国” 1.1 从 CHIP 到 Matter&#xff1a;标准统一的十年长跑 智能家居发展多年&#xff0c;却始终被 “孤岛效应” 困扰。各…

软件设计师2009-2022历年真题与答案解析(附pdf下载)

软考在即&#xff0c;现在给大家分享一下软件设计师2009-2022真题与答案解析 pdf全套&#xff0c;文末提供大家免费下载&#xff0c;大家都知道在软考备考过程中&#xff0c;拥有一套全面且实用的考试资料对于考生来说至关重要。目录如下&#xff1a; 历年真题及详解2004-2019 …

基于EasyX库开发的球球大作战游戏

目录 球球大作战 一、开发环境 二、流程图预览 三、代码逻辑 1、初始化时间 2、设置开始界面大小 3、设置开始界面 4、让玩家选择速度 5、设置玩家小球、人机小球、食物的属性 6、一次性把图绘制到界面里 7、进入死循环 8、移动玩家小球 9、移动人机 10、食物刷新…

aslist和list的区别

‌Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 ‌Arrays.asList‌&#xff1a;通过Arrays.asList方法创建的List是一个固定长度的List&#xff0c;其长度与原始数组相同。这意味着你不能通过添…

大模型预标注和自动化标注在OCR标注场景的应用

OCR&#xff0c;即光学字符识别&#xff0c;简单来说就是利用光学设备去捕获图像并识别文字&#xff0c;最终将图片中的文字转换为可编辑和可搜索的文本。在数字化时代&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术作为处理图像中文字信息的关键手段&#xff0c;其…

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…

STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…

【NLP 59、大模型应用 —— 字节对编码 bpe 算法】

目录 一、词表的构造问题 二、bpe(byte pair encoding) 压缩算法 算法步骤 示例&#xff1a; 步骤 1&#xff1a;初始化符号表和频率统计 步骤 2&#xff1a;统计相邻符号对的频率 步骤 3&#xff1a;合并最高频的符号对 步骤 4&#xff1a;重复合并直至终止条件 三、bpe在NLP中…

TMS320F28P550SJ9学习笔记15:Lin通信SCI模式结构体寄存器

今日初步认识与配置使用Lin通信SCI模式&#xff0c;用结构体寄存器的方式编程 文章提供完整工程下载、测试效果图 我的单片机平台是这个&#xff1a; LIN通信引脚&#xff1a; LIN通信PIE中断&#xff1a; 这个 PIE Vector Table 表在手册111页&#xff1a; 这是提到LINa的PI…

linux-设置每次ssh登录服务器的时候提醒多久需要修改密码

在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…

matlab求和∑函数方程编程?

matlab求和∑函数方程编程&#xff1f; 一 题目&#xff1a;求下列函数方程式的和 二&#xff1a;代码如下&#xff1a; >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…

electron桌面端开发-打开指定软件和文件

electron桌面端开发 现在越来越多的软件开发已经趋向于简单化&#xff0c;桌面端开发已经不在依赖之前的java、c等主流技术&#xff0c;目前基于node的开发越来越广泛。功能点也越来越多元化。 文章目录 electron桌面端开发前言一、打开文件的方式&#xff1f;二、exec使用步骤…

ShenNiusModularity项目源码学习(17:ShenNius.Admin.Mvc项目分析-2)

ShenNiusModularity项目的后台管理主页面如下图所示&#xff0c;该页面为ShenNius.Admin.Mvc项目的Views\Home\Index.cshtml&#xff0c;使用的是layuimini后台模板&#xff08;参考文献2&#xff09;&#xff0c;在layuimini的GitHub主页中提供有不同样式的页面模版链接&#…

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代&#xff0c;前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目&#xff0c;展示两者如何通过 RESTful API 实现无缝通信&#xff0c;让读者了解从环境搭建、代码实…

portainer.io篇

Portainer‌是一个轻量级的容器管理工具&#xff0c;支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多种平台。它提供了一个直观的Web界面&#xff0c;使用户能够轻松地管理和监控容器&#xff0c;包括创建、启动、停止、删除容器&#xff0c;以及查看容器的日志和配置信…

Dockerfile 文件常见命令及其作用

Dockerfile 文件包含一系列命令语句&#xff0c;用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续的操作都将基于该镜像进行。例如&#xff0c;FROM python:3.9-slim-buster 表示使用 Pyt…