十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本文以Microsoft Visual Studio为例,简述C/C++程序断点调试的基本方法和过程。其它的IDE环境,大同小异。
目前创新互联已为上千余家的企业提供了网站建设、域名、网站空间、网站托管维护、企业网站设计、永城网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。1. 简介本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频
在程序有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#includebool isPrime(int n) { //函数的定义
if (n<=1)
return false;
for (int i=2;iprintf("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循环的初始化语句,测试表达式,更新表达式故意分作了三行,以便于观察。
在第18行代码的行号左边单击鼠标,便会出现如图所示的红色断点(break point),在相同位置再次单击,断点便会消失。可以给同一段程序添加多个断点。
在打好断点后,选择菜单调试-开始调试。
与正常的程序运行不动,程序并没有“一口气”从头执行到尾,而是暂停在了第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行),如果测试通过,将执行循环体,否则循环结束。
在程序调试过程中,可以随时通过Alt+Tab组合键或者点击Windows任务栏图标切换至TERMINAL(终端),该终端中展示了程序当前执行阶段的全部输出。如果程序在执行过程中需要读取输入,也应在其中录入。
可以看到,2,3两个质数已被找出,4是合数被略过,正准备考察整数5。
6. 去除断点如果调试的目的已达成,准备放弃调试,可以再次单击红色断点将其取消,如下图(第18行左侧红框处):
此时,可以选择调试-继续(F5),在没有断点的情况下将程序执行完;也可以选停止调试,强行中止程序的执行。
取消断点后,我们选择了继续执行。程序执行完成后,IDE中与调试相关的箭头,局部变量列表等均消失不见,恢复至常规编辑界面。
在终端里,我们看到程序的全部执行结果。
为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!
简洁的C及C++
Python编程基础及应用
如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。
Python编程基础及应用
Python编程基础及应用实验教程
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧