C/C++程序的断点调试 - Dev C++

news2024/11/19 0:43:17

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

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

1. 简介

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

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

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

2. 程序代码

在Dev C++中创建一个源代码文件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;
}

在作者的机器上,该文件被存放在D:\TEMP目录下。

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

3. 断点

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

4.调试

在这里插入图片描述
在打好断点后,选择菜单Execute-Debug(F5)开始调试。
在这里插入图片描述
如果你得到上述提示,说明你还需要配置一些编译器选项,才能进行程序调试。

选择No。(在作者的计算机上,选Yes会导致程序崩溃)
在这里插入图片描述
选择菜单Tools-Compiler Options, 找到Settings-Linker页,将Generate debugging information(-g3)设为Yes,然后点”OK”。

选择菜单Execute-Rebuild All,重新编译程序 ,以便让上述设置事实上生效。

再次打好18行的断点,选择菜单Execute-Debug,进入调试。
在这里插入图片描述
与正常的程序运行不动,程序并没有“一口气”从头执行到尾,而是暂停在了第18行的断点处。图中的蓝色高亮行表明程序的当前执行点,准确地说,蓝色高亮的是接下来准备执行的代码行。
在这里插入图片描述
在这里插入图片描述
同别的IDE环境不同,Dev C++的调试功能比较简陋,其并不能直观显示当前全部局部变量的值。为了观察main()函数内iFound和i变量的值,我们点击Add Watch,依次加入iFound和i。如上图所示,iFound的空间已分配,其值为0,而变量i尚未到达作用域范围,未显示当前值。
在这里插入图片描述
点击Next line, 第18行被执行,第19行高亮,该行是for循环的初始化语句。如上图所见,由于初始化语句事实上还没有执行,所以i变量的当前值为1而不是2(变量赋值前,其初始值不确定)。

此时,如果把鼠标光标移动至代码内对应变量的上方,Dev C++将悬浮显示变量的当前值。
在这里插入图片描述
再次点击Next line, 代码会依次执行第19行(初始化语句),第20行(循环条件表达式)后来到第23行。严格地说,第19行和第20行应该是两步,但Dev C++将其视作一“行”一起执行了。如图所示,i变量的当前值为2。

第23行涉及一次函数调用,如果操作者希望观察isPrime( )函数内部的执行过程,应按Into function。如果操作者不关心isPrime( )内部的执行过程,只关心23行的总体执行结果,则按Next line。本次,我们选择Into function。
在这里插入图片描述
按下Into function后,我们进入到了isPrime( )函数内部,第6行蓝色高亮。对于isPrime( )函数而言,当前其局部变量仅有1个,即函数的形式参数n。该参数的值应由调用者传递进来。将鼠标悬停在变量n的上方,可见其当前值为2。当然,也可以通过Add watch将变量n纳入观察列表。

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

根据continue的语义,其将略过本轮循环的剩余语句(第25 ~ 26行),直接尝试下一轮循环。
在这里插入图片描述
按下Next line,可以看到,continue直接略过了第25 ~ 26行的剩余循环代码,直接跳到了for循环的更新表达式。由于Dev C++的调试功能不够健壮,如上图,看起来,程序的执行点跳转到了第19行,事实上,它应该指的是第21行。
在这里插入图片描述
再次按下Next line,可见i被更新表达式更新为5,再次经过循环条件测试后,程序来到了第23行。

5.观察输出

在这里插入图片描述
在程序调试过程中,随时可通过Alt+Tab组合键,或者点击Windows任务栏切换至终端窗口,查看程序执行结果。可以看到,2,3两个质数已被找出,4是合数被略过,正准备考察整数5。如果程序执行过程中需要读取键盘输入,也应该在这一窗口中提供。

6. 去除断点

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

7. 继续执行

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

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

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

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

Python编程基础及应用

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

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

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

相关文章

探花交友_第7章_即时通信(新版)

探花交友_第7章_即时通信 文章目录探花交友_第7章_即时通信1.1 什么是即时通信1.2 功能说明1.3 技术方案2. 环信2.1 开发简介2.2 环信Console2.3 环信API介绍初始化基础API3. 抽取环信组件3.1 编写Properties对象3.2 编写HuanXinTemplate3.3 编写自动配置类3.4 环信集成测试4. …

Windows Defender 绕过(RTO I Lab环境实测)

背景 15号这天我通过了 RTO I 的考试。细想 RTO I 考试的 Lab&#xff0c;好像 Windows Defender&#xff08;以下简称 WD&#xff09;的保护做的比 OSEP 考试时还要好&#xff0c;更加严格。 回想起 9 月考 OSEP 的时候&#xff0c;只要你的 Payload 在文件创建&#xff08;…

这可能是Github 最全的Java面试笔记, 简直把所有 Java 知识面试题写出来了

前言 作为一个 Java 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#x…

大数据 Hadoop集群配置

配置Hadoop集群 在master虚拟机上配置hadoop 编辑Hadoop环境配置文件 - hadoop-env.sh 命令&#xff1a;cd $HADOOP_HOME/etc/hadoop&#xff0c;进入hadoop配置目录 命令&#xff1a;vim hadoop-env.sh 命令source hadoop-env.sh&#xff0c;让配置生效 编辑Hadoop核心配…

项目的可交付成果

目录 概述 定义 形式 评审与验收 概述 概念来自PMBOK,这书真的要细嚼慢咽,“可交付成果”多次出现,全书总共出现了288次,贯穿全书,绝对是个核心概念。 定义 可交付成果是在某一过程、阶段或项目完成时,必须产出的任何独特并可核实的产品、成果或服务能力。它通常是…

2022吴恩达机器学习课程——第二课(神经网络)

注&#xff1a;参考B站视频教程 视频链接&#xff1a;【(强推|双字)2022吴恩达机器学习Deeplearning.ai课程】 文章目录第一周一、神经元二、神经网络三、代码实现 & Tensorflow四、前向传播五、强人工智能六、矩阵乘法 (简单&#xff0c;可以跳过)第二周一、用Tensorflow训…

20221217英语学习

今日新词 haul v.&#xff08;人&#xff09;拖&#xff0c;拉 herd n.人群&#xff1b;&#xff08;尤指有蹄的哺乳动物&#xff09;兽群&#xff0c;牧群 focus v.把注意力集中于&#xff0c;重视&#xff1b;集中&#xff1b;&#xff08;使&#xff09;调节焦距 result…

代码随想录刷题记录day44 股票问题3 4

代码随想录刷题记录day44 股票问题3 4 123. 买卖股票的最佳时机 III 思想 dp数组定义 递推公式 dp[i][0] 第i天不操作股票手头最大的现金 i从0开始 dp[i][1] 第i天第一次持有股票的手头最大的现金 dp[i][1] max: i-1天不操作&#xff0c;第i天才买入&#xff1a;dp[i-1][0…

港科夜闻|香港科技大学(广州)拟获批首个省级重点实验室

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科技大学(广州)拟获批首个省级重点实验室。2022年12月6日&#xff0c;广东省科学技术厅发布关于2023年度平台基地及科技基础条件建设、高水平科技期刊建设拟立项目清单的公示&#xff0c;香港科大(广州)申报的广东省通感…

「Spring Cloud Alibaba官方手册」首发爆火,Github上标星243k

几年前 Dubbo被 SpringCloud所取代&#xff0c;相同的剧本&#xff0c;可惜阿里巴巴和 Spring社区都是巨头&#xff0c;巨头之间战斗要考虑很多&#xff0c;于是它们想到了合作&#xff0c; SpringCloud与alibaba相结合&#xff0c;技术上有人负责更新新的组件&#xff0c;也还…

今年面试太难,我凭借这份Java架构面试指南,成功跳槽涨薪10K

见字如面&#xff0c;这里是阿鑫~ 时光飞逝&#xff0c;转眼2022已经快结束了&#xff0c;最近内卷严重&#xff0c;大环境并不是很好&#xff0c;相信很多小伙伴也在准备明年金三银四的面试计划 ​跳槽加薪 职场中加薪有个屡试不爽的方法&#xff0c;那就是跳槽 每每听到周围…

浮点数运算不精确的问题解决和注意事项(BigDecimal)

总结&#xff1a;浮点数运算不精确的问题本质上是在存储的时候就不精确&#xff0c;这个问题会持续到即使使用到专业的工具类BigDecimal来使用时&#xff0c;如果仅仅只是传double类型做入参时依然会导致运算不精确&#xff0c;所以即使在使用BigDecimal工具类进行构造时也要使…

论文浅尝 | Knowledge Graph Contrastive Learning for Recommendation

笔记整理&#xff1a;刘尧锟&#xff0c;天津大学硕士链接&#xff1a;https://arxiv.org/pdf/2205.00976.pdf动机知识图谱已被用作有用的辅助信息来提高推荐质量。在这些推荐系统中&#xff0c;知识图谱信息通常包含丰富的事实和项目之间的内在语义相关性。然而&#xff0c;此…

Python源码学习新手攻略

Python源码学习是许多编程初学者在学习Python过程中十分重要的一个必经步骤&#xff0c;不仅如此&#xff0c;一些有一定开发经验的程序员想要提升自身&#xff0c;也常常需要阅读并学习优秀核心技术栈的源码。那么我们应该如何开始Python源码学习呢&#xff1f;下面小编就来和…

自学Web前端开发学习讲解 – 入门篇

很多人都对web前端感兴趣&#xff0c;这一期主要聊关于如何入门学习Web前端开发的过程分享&#xff0c;此篇适合想入门初学者&#xff0c;大佬就不用看了。主要内容是以本人这一路自学web前端的一些经验和建议&#xff0c;学习哪些知识&#xff0c;以及如何正确的去学&#xff…

AI绘画火爆,到现在还只是冰山一角?AIGC掀起当代新艺术浪潮

前言&#xff1a; hello&#xff0c;大家好我是Dream。近日&#xff0c;各大社交平台掀起了一股“AI绘图”风潮&#xff0c;很多同学朋友纷纷在社交平台上晒出了属于自己的AI照片&#xff0c;一时间AI相关话题热度高涨。那对于AI绘画以及开启AI内容创作新时代的昆仑万维你究竟了…

东北大学2023分布式操作系统考试题目及答案

Note&#xff1a;答案仅供参考&#xff0c;自己所写&#xff0c;不是标准答案&#xff0c;若发现错误&#xff0c;请指正&#xff0c;谢谢&#xff01; 文章目录考试题目参考答案考试题目 1、简述分布式系统的设计目标中开放性的特点有哪些&#xff1f; 、 、 、 、 、 、 、…

​燕东微科创板上市:市值276亿 亦庄国投与京东方是股东

雷递网 雷建平 12月16日北京燕东微电子股份有限公司&#xff08;简称&#xff1a;“燕东微”&#xff0c;股票代码为&#xff1a;“688172”&#xff09;今日在科创板上市&#xff0c;燕东微本次发行17986.5617万股&#xff0c;发行价21.98元&#xff0c;募资总额39.56亿元。燕…

关于hcaptcha (vm wasm ob)三合一

该文章主要提供交流学习使用&#xff0c;请勿利用其进行不当行为&#xff01; 如本篇文章侵犯了贵公司的隐私&#xff0c;请联系我立刻删除&#xff01; 如因滥用解密技术而产生的风险与本人无关&#xff01; 1 Hcaptcha hCaptcha 旨在解决机器学习中最劳动密集型的问题&am…

毕业设计 - 基于 java web的网上花店销售系统设计与实现【源码+论文】

文章目录前言一、项目设计1. 模块设计数据流图功能模块2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 毕业设计项目: 网上花店销售系统的设计与实现 一、项目设计 1. 模块设计 数据流图 功能模块 1、首页&#xff08;主界面&#xff09; 提供简洁美观的主界…