本文以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编程基础及应用实验教程

C/C++程序的断点调试 - Dev C++相关推荐

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

    本文以Microsoft Visual Studio为例,简述C/C++程序断点调试的基本方法和过程.其它的IDE环境,大同小异. 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用. ...

  2. C/C++程序的断点调试 - Visual Studio Code

    本文以Visual Studio Code为例,简述C/C++程序断点调试的基本方法和过程.其它的IDE环境,大同小异. 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载 ...

  3. C/C++程序的断点调试

    本文以Qt Creator为例,简述C/C++程序断点调试的基本方法和过程.其它的IDE环境,大同小异. 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作 ...

  4. 【微信小程序】断点调试一

    路径如下图: 高效的断点调试,解决bug的利器 具体步骤 1.先运行可浏览页面 2.找到待调试的页面 3.在调试器面板 Sources里找到对应路径的页面和js文件 4.在适当的位置设置断点 5.触发 ...

  5. eclipse开发java程序,断点调试

    断点简单的解释就是告诉编译器在执行到该点(该句)的时候,停一下,方便用户看看当前的情况,包括变量等等. Eclipse的设置断点很简单的啊,在java视图下,直接在你要设置断点的那行的最左边,双击即可 ...

  6. php断点调试的几种方法

    断点调试是程序开发过程中的一个必不可少的步骤,一些程序的断点调试操作比较简单,只需在编辑器里标记哪行为断点,便可得知程序各个环节的输出结果,例如c#.VB.Delphi等语言. 但是对于PHP程序的调 ...

  7. Unity3D的断点调试功能

     这篇文章介绍的调试工具是Unity自带的MonoDevelop, 假设要用VS,须要下载unityvs http://unityvs.com/. http://liweizhaolili.blo ...

  8. vue 浏览器调试 样式如何定位样式_浏览器断点调试-程序员的必修课

    一.源码调试/debugger方法 1.1控制台调试按钮介绍 Resume script execution恢复断点调试.常用在一个方法调用多个js文件(适用冗长js代码使用).点击这个会直接跳转到下 ...

  9. 32. 脱壳篇-简单带壳的程序、反调试带壳的程序(堆栈平衡原理找OEP、代码段设置断点)

    第一个程序 OEP为46B6F9 PE头位置为46B000到46D000区间,have a nice day! 就是壳 一定要点上箭头指向处,dump改名 清除区段 ,删除壳,保存 第二个程序(市面上 ...

最新文章

  1. oracle本地连接地址,关于Oracle本地连接出现与监听有关的问题的解决方法探讨,oracle本地连接...
  2. 源代码的下载和编译:
  3. Shell 脚本的时间的加减,以及时间差的计算
  4. Storm精华问答 | Storm如何连接MySQL?
  5. oracle 移动日志文件,Oracle数据库移动数据文件、日志文件和控制文件
  6. 【OpenCV 例程200篇】19. 图像的圆形遮罩
  7. vue-strap的几种安装方式哪个最简便?
  8. AAAI'22 Oral | 复旦x字节等提出:基于无监督编辑的反事实故事改写
  9. 【动态规划】ST算法解决区间最值询问问题(RMQ问题)
  10. Tkinter注册界面判断用户名是否唯一的合法性验证(Python3.7)
  11. 惠普企业级服务器型号,惠普企业级服务器HP rx8640
  12. 白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖
  13. MySQL中EXPLAIN解析
  14. openssh和openssl下载网址
  15. 程序员的“我爱你”表达方式
  16. IBM Cloud VPC网络与本地办公网络的互通
  17. Lingo 中的各种函数
  18. 机器人中的坐标转换关系(个人记录学习)
  19. mysql国内研究现状_Php+Mysql技术的研究现状和发展趋势
  20. 剖析SQL Server 2005查询通知之基础篇

热门文章

  1. 页面数据埋点统计方案
  2. NGS数据分析实践:05. 测序数据的基本质控 [1] - FastQC
  3. 华为OD机试注意事项,来自已考人员的经验
  4. 华为路由交换机端口的三种模式
  5. 西部将建国家算力枢纽节点,“东数西算”怎么运?
  6. 【蓝桥杯选拔赛真题28】python字符串包含字符 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  7. 聚观早报 | 英伟达推「AI」超算;中国2030年前载人登月
  8. 北华航天工业学院计算机科学与技术,北华航天工业学院计算机科学与工程系介绍...
  9. CSS——滤镜(filter )
  10. 三十八、bugku文件上传