网站首页 > 基础教程 正文
本文以Qt Creator为例,简述C/C++程序断点调试的基本方法和过程。其它的IDE环境,大同小异。
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与调试相关的箭头,右方的局部变量列表等均消失不见,恢复至常规编辑界面。
在控制台输出窗口中,可以看到程序执行的全部结果。
本案例节选自作者编写的教材及配套实验指导书。
《C++编程基础及应用》(高等教育出版社,出版过程中)
《Python编程基础及应用》,高等教育出版社
《Python编程基础及应用实验教程》,高等教育出版社
高校教师同行如果期望索取样书,教学支持资料,加群,请私信作者,联系时请提供学校及个人姓名为盼,各高校在读学生勿扰为谢。
青少年读者们如果期望系统性地学习Python及C/C++程序设计语言,欢迎尝试下述今日头条(西瓜)免费视频课程。
- 上一篇: C++ 编程入门指南:开启代码世界的奇妙之旅?
- 下一篇: 数学表达式计算器
猜你喜欢
- 2025-01-15 「C语言编程」如何整蛊你的损友,让他的电脑一直关机?
- 2025-01-15 C++中int型和char型一起运算结果是什么?在编程中有何用处?
- 2025-01-15 知识分享:C语言语法总结,初学者可收藏
- 2025-01-15 「初识C语言」C语言保留字(关键字)详解
- 2025-01-15 C++代码解析8
- 2025-01-15 C++网络编程:TCP并发通信、I/O多路复用(转接)技术
- 2025-01-15 数学表达式计算器
- 2025-01-15 C++ 编程入门指南:开启代码世界的奇妙之旅?
- 2025-01-15 c++编程实战入门:新鸡兔同笼
- 2025-01-15 通过例子学习现代C++ :9 参数包和 std::visit
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)