C/C++程序的断点调试 - Microsoft Visual Studio

news2025/2/3 18:49:43

本文以Microsoft Visual Studio为例,简述C/C++程序断点调试的基本方法和过程。其它的IDE环境,大同小异。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

1. 简介

在程序有BUG/缺陷,需要修复时,断点调试是发现缺陷的重要方法。对于初学者而言,断点调试还有另外一个用途:帮助理解程序背后的逻辑。

本文以Microsoft Visual Studio为例,简述C/C++程序断点调试的基本方法和过程。其它的IDE环境,大同小异。

在进行后续调试试验前,需要先对Microsoft Visual Studio的C/C++编译开发环境进行安装和配置。详细过程请参见下述链接:http://codelearn.club/2022/11/vs/

2. 程序代码

在Microsoft Visual Studio中创建一个Windows控制台应用项目,项目名称为DebugExample,然后将DebugExample.cpp中代码修改如下(复制粘接):

//Project - DebugExample
#include <stdio.h>
#include <stdbool.h>

bool isPrime(int n) {     //函数的定义
    if (n<=1)
        return false;
    for (int i=2;i<n;i++)
        if (n % i == 0)
            return false;

    return true;
}

int main(){
    printf("Try to find all prime number(<=10):\n");

    int iFound = 0;       //发现的质数个数
    for (int i=2;
         i<=10;
         i++)
    {
        if (!isPrime(i))
            continue;
        iFound++;
        printf("%d, ",i);
    }

    printf("\n%d prime numbers been found.",iFound);
    return 0;
}

在这里插入图片描述
上述程序的用途在于找出2 ~ 10之间的全部质数并打印出来。请读者注意第19 ~ 21行,for循环的初始化语句,测试表达式,更新表达式故意分作了三行,以便于观察。

3. 断点

在这里插入图片描述
在第18行代码的行号左边单击鼠标,便会出现如图所示的红色断点(break point),在相同位置再次单击,断点便会消失。可以给同一段程序添加多个断点。

4.调试

在这里插入图片描述
在打好断点后,选择菜单调试-开始调试。

在这里插入图片描述
与正常的程序运行不动,程序并没有“一口气”从头执行到尾,而是暂停在了第18行的断点处。图中的黄色箭头表明程序的当前执行点,准确地说,箭头所指的行是接下来准备执行的代码行。

在窗口的左下角,自动窗口中可以看到程序在当前执行阶段的局部变量的名称及当前值。可以看到,此时有iFound变量存在,其值为0。

注意:此时iFound的0值是不确定的,事实上,0到iFound的赋值尚未执行。
在这里插入图片描述
在调试菜单中,可以看到诸多调试选项,其中常用的有:逐语句,逐过程,跳出。在调试过程中,读者既可以使用菜单项,也可以使用快捷键,或者工具条中的工具按钮来发出调试命令。
在这里插入图片描述
点击逐语句(F11),可以看到第18行被执行,黄色箭头指向第19行。此时,for循环内的局部变量i出现在下方列表中。请读者注意此时i的当前值为690,而不是2,因为for循环的初始化语句尚未执行。

注意:在变量没有被初始化前,其值是不确定的,所以读者真实调试时,得到的值很可能不是690。
在这里插入图片描述
再次点击逐语句(F11),第19行被执行,可见变量列表中的i值变成了2。黄色箭头来到了第20行,这是for循环的条件判断表达式。
在这里插入图片描述
继续按下F11,for循环在进行了条件判断后,准备执行循环体,黄色箭头来到第23行。

第23行涉及一次函数调用,如果操作者希望观察isPrime( )函数内部的执行过程,应按F11。如果操作者不关心isPrime( )内部的执行过程,只关心23行的总体执行结果,则按逐过程(F10)。本次,我们按逐语句(F11)。
在这里插入图片描述
在这里插入图片描述
连按两次F11后,我们进入到了isPrime( )函数内部,黄色箭头指向第6行。对于isPrime( )函数而言,当前其局部变量仅有1个,即函数的形式参数n。该参数的值应由调用者传递进来。在下方的列表中,我们看到该值为2。
在这里插入图片描述

一直按F11,直到isPrime()返回,由于2是质数,所以isPrime()函数返回真(见下方列表)。
在这里插入图片描述
再次按下F11, 由于第23行不是质数的条件不成立,第24行不会被执行,黄色箭头略过了第24行,指向了第25行。
在这里插入图片描述
再次按下F11,黄色箭头来到第26行,可见由于第25的执行,iFound由0变1。
在这里插入图片描述
一直按**逐过程(F10)**进行循环,直到i = 4且黄色箭头指向第23行。
在这里插入图片描述
本次我们选择不进入isPrime()函数,再次按下逐过程(F10)。由于i=4不是质数,因此第23行的条件成立,黄色箭头跳转到第24行的continue语句。

根据continue的语义,其将略过本轮循环的剩余语句(第25 ~ 26行),直接尝试下一轮循环。
在这里插入图片描述
按下逐语句(F11),可以看到,continue直接略过了第25 ~ 26行的剩余循环代码,直接跳到了for循环的更新表达式,如图中红色箭头所示。
在这里插入图片描述
再次按下F11,可见for循环在更新表达式执行后再次来到了循环测试表达式(第20行),如果测试通过,将执行循环体,否则循环结束。

5.观察输出

在这里插入图片描述
在程序调试过程中,可以随时通过Alt+Tab组合键或者点击Windows任务栏图标切换至TERMINAL(终端),该终端中展示了程序当前执行阶段的全部输出。如果程序在执行过程中需要读取输入,也应在其中录入。

可以看到,2,3两个质数已被找出,4是合数被略过,正准备考察整数5。

6. 去除断点

如果调试的目的已达成,准备放弃调试,可以再次单击红色断点将其取消,如下图(第18行左侧红框处):
在这里插入图片描述
在这里插入图片描述
此时,可以选择调试-继续(F5),在没有断点的情况下将程序执行完;也可以选停止调试,强行中止程序的执行。

7. 继续执行

取消断点后,我们选择了继续执行。程序执行完成后,IDE中与调试相关的箭头,局部变量列表等均消失不见,恢复至常规编辑界面。
在这里插入图片描述
在终端里,我们看到程序的全部执行结果。

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
Python编程基础及应用
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程
在这里插入图片描述

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

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

相关文章

【BFS】八数码问题(c++基础算法)

目录 一.读题 二.在做题之前 1.康拓展开 2.DFS和BFS的区别 3.栈和队列的区别 三.做题 1.算法原理 2.算法实现 ①队列 ②康托展开 ③标记 四.AC代码 一.读题 作为最经典的一道宽度优先搜索题&#xff0c;它的题面并不是很难懂。 【宽搜&#xff08;难度&#xff1a;6&a…

爆款短视频拍摄技巧之摇、移、跟拍等,这样拍的视频才更有吸引力,速收藏

爆款短视频拍摄技巧之拍摄手法,这样拍的视频才更有吸引力。 拍摄技巧主要分为两个部分&#xff0c;一个是构图&#xff0c;一个是拍摄手法。上一篇我们聊过了两种构图手法&#xff0c;接下来咱们聊一下拍摄手法&#xff0c;也就是我们常说的推、拉、摇、移、跟这五种手法。 其…

NNDL 2022秋

第一届AI专业&#xff0c;很多课程都是第一次开课&#xff0c;老师和学生都在“摸着石头过河”。 好处是所学内容比较新&#xff0c;跟得上“潮流”&#xff0c;学习意愿比较强。 难处是教学资料相对欠缺&#xff0c;需要学的内容较多&#xff0c;难度较大。 大家经过一学期…

leetcode:1494. 并行课程 II【dfs记忆化 + 状态压缩】

目录题目截图题目分析ac code总结题目截图 题目分析 这道题很像toposort&#xff0c;但实际不是因为那些indeg为先为0的&#xff0c;先选不一定好的考虑到n很小我们使用状态压缩dfs(state)表示当前state下&#xff0c;还需要多少个学期结束用pre数组存一下每个idx对应的前置条…

基于C++11 实现的线程池

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 基于C11 实现的线程池基于C11 实现的线程池1、线程池原理2、线程池的设计思路&#xff1f;3、一个基于C11的优秀的线程池3.1 头文件3.2 线程池类3.3 构造函数实现3.4 入队—添…

ModStartBlog v6.4.0 升级输入过滤、多文件组件,修复已知问题

V6.4.0版本更新 2022年12月20日ModStartBlog发布v6.4.0版本&#xff0c;增加了以下14个特性&#xff1a; [新功能] 富文本过滤规则调整优化[新功能] ArrayPackage数组输入数据包处理器[新功能] 请求输入组件新增多文件路径类型[新功能] 多文件上传组件[新功能] 所有组件新增t…

RCE代码及命令执行(详解)

RCE代码及命令执行1.RCE漏洞1.1.漏洞原理1.2.漏洞产生条件1.3.漏洞挖掘1.4.漏洞分类1.4.1.命令执行1.4.1.1.漏洞原理1.4.1.2.命令执行危险函数1.4.1.3.漏洞检测1.4.2.代码执行1.4.2.1.漏洞原理1.4.2.2.代码执行危险函数1.4.2.3.漏洞检测1.5.命令执行和代码执行区别2.命令执行2.…

QT学习记录(二)最基础的工程

文件 工程新建后会有这几个文件&#xff0c;自动生成的 main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec(); }QApplication a(argc, argv);这里…

Mentor-dft 学习笔记 day45-MTFI

Using MTFI Files此节介绍MTFI&#xff08;Mentor Tessend Fault Information&#xff09;功能&#xff0c;可用于ATPG工具和Tessent LogicBIST。MTFI是用于存储故障状态信息的通用且可扩展的文件格式。MTFI File Format MTFI是在“dft-edt”和“patterns-scan”上下文中读取和…

运用大O来给代码提速(冒泡排序)

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余&#xff0c;我决定把这本书精彩的部分摘录出来与大家分享。 本章内容 写在前面 1.冒泡排序 2.冒泡排序实战 3.冒泡排序的实现 4.冒泡排序的效率 5.二次问题 6.线性解决 7.总结 写在前面 大 O记…

Diffusion Model合集 part2

扩散模型原理介绍2五&#xff0c;逆扩散过程(Reverse Process)六&#xff0c;扩散过程中的后验的条件概率q(xt−1∣xt,x0)q(x_{t-1}|x_{t},x_{0})q(xt−1​∣xt​,x0​)七&#xff0c;目标数据分布的似然函数八&#xff0c;Diffusion Probabilistic Model的算法代码五&#xff…

“专利费用减缓”怎么申请?

在专利申请时&#xff0c;很多申请人对“专利费用减缓”的概念并不了解&#xff0c;或者不太清楚。甚至有很多申请人一听到专利申请可以请求费用减缓&#xff0c;就以为申请专利是不要钱的。当然&#xff0c;这样的理解就存在了很大的偏差了&#xff0c;所以&#xff0c;我们今…

Java Arrays类

JavaArrays类\huge{Java \space Arrays类}Java Arrays类 概述 Arrays类Arrays类Arrays类&#xff1a;本质就是一个工具类&#xff0c;用于操作数组元素的。 常用API ①. toString()&#xff08;重写过的toString方法&#xff09; toString()toString()toString()&#xff1a…

人才招聘网 招聘系统源码找工作源代码 各行业的招聘网站门户源码

运行环境&#xff1a;VS2015SqlServer2008R2.NET4.0 系统介绍&#xff1a; 适用于各地方或者各行业的招聘网站门户&#xff0c;相当强大的人才招聘网站&#xff0c;可登陆注册、支持第三方登陆&#xff0c;强大额后台管理&#xff0c;功能全面&#xff0c;界面美观 职位和简历…

如何用yolov5 训练自己的数据

文章目录 说明数据准备划分数据集转换数据label 格式训练前准备修改图片路径修改训练配置文件 voc.yaml修改 yolo配置文件开始训练没有GPU 或显存不够的说明 利用yolov5 训练自己的数据集通常需要利用自己标注的数据进行训练 接下来记录下如何训练自己的数据 数据准备 我这用的…

【数据结构】- 面试题

面试题1. 删除链表中的节点2. 反转一个链表&#xff08;非递归解法&#xff09;3. 判断一个链表是否有环&#xff08;快慢指针&#xff09;问题&#xff1a;[快慢指针为什么一定会相遇](https://blog.csdn.net/Leslie5205912/article/details/89386769)4. 获取单链表的节点个数…

【轻量级开源ROS 的机器人设备(5)】--(3)拟议的框架——µROS节点

前文链接&#xff1a;(2条消息) 【轻量级开源ROS 的机器人设备&#xff08;5&#xff09;】--&#xff08;2&#xff09;拟议的框架——ROS节点 五、静态栈分析 在处理运行多个资源的严格受限平台时线程&#xff0c;重要的是将堆栈使用保持在最低限度。这甚至 在利用具有同质堆…

技嘉电脑怎么开启vt模式?

电脑开启vt模式后&#xff0c;可以提高主板的运行速率&#xff0c;提高性能。那就有一些使用技嘉电脑的用户问技嘉主板怎么开启vt模式&#xff1f;下面小编就来教教大家技嘉电脑开启vt模式的方法。 Intel芯片组的技嘉主板 1、一般情况下&#xff0c;也就是在电脑开机的时候&…

计算机网络、操作系统刷题笔记15

计算机网络、操作系统刷题笔记15 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sq…

差分详细讲解(C++)

每日一句:平凡的我在人多的地方曾极力小心翼翼&#xff0c; 但不知从何时起 &#xff0c;我不太在意别人的目光了。比起被人觉得是个怪人&#xff0c;我现在更害怕浪费时间。 差分一、一维差分二、二维差分一、一维差分 差分就是前缀和的逆运算,如果你不懂什么是前缀和,看这里…