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

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

1. 简介

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

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

2. 程序代码

在Qt Creator中创建一个Non Qt - Plain C Application (纯C控制台应用程序),然后录入如下代码:

//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行代码的行号左边(图中红框A处)单击鼠标,便会出现如图所示的断点(break point),在相同位置再次单击,断点便会消失。可以给同一段程序添加多个断点。

单击图中红框B内的按钮,断点调试开始。

4. 调试


与正常的程序运行不同,黑色的控制台界面一闪而过,程序将暂停在第18行的断点处。读者仔细观察,应可见第18行行左会出现一个黄色的箭头(图中标A处),该黄色箭头表明当前程序执行点,准确地说,箭头所指向的行是接下来准备执行的代码行。

在界面标B处,有一个列表,这个列表列出了程序当前执行阶段的局部变量的名称及当前值。可以看到,此时,有iFound变量存在,其值为0,类型为int。

展开调试菜单,可以看到很多与调试相关的菜单项。本文主要使用到两个,分别是单步跳过(F10)以及单步进入(F11)。在调试过程中,使用该菜单与直接按下F10、F11作用相同。本文主要使用快捷键来完成。读者需要注意,如果你使用的是笔记本电脑,笔记本电脑的F10、F11等键通常是复用的,你可能需要结合其它按键来触发F10、F11按键。如果实在弄不明白,也可以使用调试菜单。

按一下F10(单步跳过),可以看到第18行被执行,黄色箭头指向第19行。此时,for循环内的局部变量i出现在右方的列表中,其值为16,这说明for循环局部变量i的空间已被分配,但for循环的初始化语句尚未执行,i还没有获得初始值0。

注意:在变量没有被初始化前,其值是不确定的,所以读者真实调试时,得到的值很可能不是16。

再次按下F10(单步跳过),可以看到黄色箭头指向第23行。因为for循环初始化语句的执行,右方列表中i的当前值变成了2。

第23行涉及一次函数调用,如果操作者希望观察isPrime( )函数内部的执行过程,应按F11(单步进入)。如果操作者不关心isPrime( )内部的执行过程,只关心23行的总体执行结果,则按F10(单步跳过)。本次,我们按F11。

按下F11后,我们进入到了isPrime( )函数内部,黄色箭头指向第6行。对于isPrime( )函数而言,当前其局部变量仅有1个,即函数的形式参数n。该参数的值应由调用者传递进来。在右方的列表中,我们看到该值为2。

一直按F10,直到isPrime( )函数返回,由于2是质数,所以第23行的不是质数的条件不成立,第24行不会被执行,黄色箭头略过了第24行,指向了第25行。

按F10执行第25行后,黄色箭头指向第26行,iFound值由0变为1。

一直按F10进行循环,直到i = 4且黄色箭头指向第23行。

本次我们选择不进入isPrime( )函数,再次按下F10(单步跳过)。

由于i = 4不是质数,因此第23行的条件成立,黄色箭头跳转到第24行的continue语句。

根据continue的语义,其将略过本轮循环的剩余语句(第25 ~ 26行),直接尝试下一轮循环。

再次按下F10,可以看到,continue直接略过了第25 ~ 26行的剩余循环代码,直接跳到了for循环的更新表达式,如图中红色箭头所示。

再次按下F10, 可以看到更新表达式被执行,i值由4变成了5,黄色箭头指向了第19行,该行将进行循环测试(i <= 10),如果测试通过,则将执行循环体,否则循环结束。

说明:读者可能会疑惑,测试表达式在第20行,为何跳转到第19行?作者的回答:此处确实是在执行第20行的循环测试,调试器标指向第19行并不十分恰当。

5. 观察输出

在Windows环境下,读者此时可以按Alt + Tab组合键切换到控制台窗口去观察到当前执行阶段为止的输出情况。

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

说明:也可以在Windows任务栏中点击对应按钮切换到控制台输出窗口,见下图中红色方框所示。

6. 去除断点

如果调试的目的已达成,准备放弃调试,可以再次单击红色断点将其取消,如下图:


此时,可以选择Continue (继续执行,F5),在没有断点的情况下将程序执行完;也可以选停止调试,强行中止程序的执行。

7. 继续执行

取消断点后,我们选择了继续执行。程序执行完成后,Qt Creator与调试相关的箭头,右方的局部变量列表等均消失不见,恢复至常规编辑界面。

在控制台输出窗口中,可以看到程序执行的全部结果。

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

简洁的C及C++

Python编程基础及应用

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

Python编程基础及应用

Python编程基础及应用实验教程

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

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

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

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

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

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

    本文以Visual Studio Code为例,简述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. ActiveMQ_3Java实现
  2. linux-tar命令详解
  3. 根据文件扩展名获取系统图标
  4. 程序员为什么想进大厂,看看年终奖你们就知道了
  5. php后端语言的基本语法
  6. 人工智能的炒作_人工智能与网络安全结合从炒作走向现实
  7. xor和路径(codevs 2412)
  8. 计算机信息学中比较大小的代码,信息学奥赛计算机基础知识.doc
  9. faster rcnn resnet_张航、李沐等人提出ResNet最强改进版:性能提高3%,参数不增
  10. 超全必读!NLP 事件抽取综述(下)
  11. java继承,final,super,Object类,toString,equals,
  12. php评论表情包怎么引入,纯代码实现WordPress添加评论表情(心情)的教程
  13. 西北工业大学noj数据结构实验003稀疏矩阵转置
  14. 计算机考试二级搜题软件,计算机二级搜题库-可以帮助计算机二级备考生进行备考的刷题软件...
  15. 怎么在PPT里面添加表格
  16. 脚本小子_Lua函数
  17. Python爬虫一则
  18. SQL中的Exists 用法解释
  19. iOS-自定义键盘选择器
  20. P4828 Nagisa loves Tomoya

热门文章

  1. strerror函数的使用
  2. SAP MIGO货物移动的错误消息未能正确显示到相应行项目
  3. 沉浸式音视频互动要通过什么技术来实现?
  4. GPS位置模拟-安卓
  5. 大数据融合技术:问题与挑战
  6. Python学习2:绘制美国队长之盾(基础)
  7. 一种基于倏逝波的离子浓度测试芯片
  8. android 内置滤镜,Android滤镜开发(一) 开篇:关于滤镜
  9. LOAM笔记及A-LOAM源码阅读
  10. 使用jedis连接redis-cluster模拟缓存击穿,穿透,雪崩场景