vc6.0环境下程序调试教程

上传人:无*** 文档编号:98348632 上传时间:2022-05-29 格式:DOC 页数:12 大小:742KB
收藏 版权申诉 举报 下载
vc6.0环境下程序调试教程_第1页
第1页 / 共12页
vc6.0环境下程序调试教程_第2页
第2页 / 共12页
vc6.0环境下程序调试教程_第3页
第3页 / 共12页
资源描述:

《vc6.0环境下程序调试教程》由会员分享,可在线阅读,更多相关《vc6.0环境下程序调试教程(12页珍藏版)》请在装配图网上搜索。

1、更多共享就在: , 个人整理,没有版权,欢迎共享avbbtv如何在Visual C+ 6.0坏境下进行简单的C语言程序调试桂林电子科技大学波仔 303020983文章简介本文主要介绍如何在VC6.0坏境下进行简单的C语言程序调试。作为阅读本 文的基础,读者应该熟悉如何在VC6.0坏境I、建立Wm32 Console Application (Win32控制台程序)类型的工程。请结合文章给出的案例,按照文档中的描述一 步一步做。如果只是阅读,则收效甚微。在做完文章给出的案例后,你应该尝试 着将文章中介绍的知识和技巧应用到你实际开发的程序中。如果阅读完一遍后, 对调试基本概念还是不了解,建议你再多

2、看几遍。在介绍如何进行C语言程序调试(debuggmg)前,首先介绍程序调试的概念。 调试(debug)一词在计算机领域最早被提及,源于美国人Adnrnal Grace Hopper(葛 丽丝霍普、COBOL语言发明者、电脑科学家)。二十世纪四十年代(1940s)Grace Hopper在哈佛人学为名为马克2号(MarkII)的计算机(由IEM公司制造)编写程序 时,有一次在排除计算机故障时,发现一只飞蛾被夹在触点原件之间,导致计算 机无法运行。于是她诙谐的把计算机故障称之为“臭虫(bug)”,把排除程序故障 称之为debug o从此之后,在计算机领域,程序调试或查找程序故障称为debug o

3、 进行程序开发时,很多情况是程序通过编译、链接(亦即不存在语法错误), 但是在运行时往往得不到正确的结呆(需要多组输出数据进行测试)。这时往往意 味着程序存在逻辑错误(与语法错误对应,通常是指程序所体现出的逻辑不符合 开发者要求,或者是开发者本身对程序所要解决的某一问题的理解存在逻辑偏 差),而查找逻辑错误的过程可称之为程序调试。程序案例下面以一个程序案例为例,介绍如何在VC6.0下进行程序调试。案例:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6 的因子为1,2, 3,而6=1+2+3 ,因此是“完数”。编程序找出1000之内的所有 的完数,并按下面的格式输出其因子:6 it

4、s factors aie 1, 2, 3 表1是某同学编写的源程序。在VC6.0卜建立Win32 Console Application类 型工程后,进行编译链接的结果如图1所示。对于表1中的程序功能,在其源代 码中相应注释已给出说明。对于该源代码编写是否合理、简洁,目前不做任何评 论。表1求1000以内所有的完数C源代码# iiicludemain()iiit n,a,b,c.d,sum=O;for (a=0;a=8;a+) /a表示一个三位数中的百位for (b=0;b=8;b+) /b表示一个三位数中的十位 _for (c=l;c=8;c+) c表示一个三位数中的个位 _ n=100*

5、a+b*10+c; /n 表示一个T000 以内的数for (d=l;dn;d+)if (n%d=O) d表示ml之间的数,如果ii能整除d,则d是11的 一个因子sum=suni4-d; /sum表示n的因子之和if (n=sum) /如果n与n的因子之和相等,则表明n是一个完数pnntf(” nM);prmtf( H%dn 卫);piintfC its factors aie H );foi (d=l;dn;d+)if (n%d=O)pnntfC%d” ,d); prmtf(n iiH);return 0;从图1的编译链接结果可知,该程序不存在语法错误。该程序的运行结果如图2所示。从图2及

6、表1中的代码可看出,程序运行后并没有输出1000以内的 所有完数及其因子。从而可知程序结果与开发者预期不一致(也就是说,程序存 在逻辑错误),这时需要通过调试的手段来找出逻辑错误,并加以修改。图1对程序源代码编译连接后的结果X E:XGQIM2010-2011C_PROGA1III(;_EXPERMEin_ASOlJRCE_CODE、Press any key to cont inuei1程序运行结束后,无任何输出图2程序的运行结果在进行程序调试时,通常需要在某一行代码设置断点。断点可理解为中断或 暂停。当程序运行时,若遇到设置的断点,则会在断点所在的代码行暂停下来。 其功能是使得开发者,在特

7、定的某行代码位置,查看程序运行的状态(变量值、 逻辑关系等)是否符合开发者的预期要求,从而找出程序逻辑错误所在。在介绍程序调试时,首先介绍如何在程序中插入断点,如图3所示。编译微 型栏最右边一个工具按钮为插入断点(或删除断点)按钮,每点击该按钮一次,则 会在当前光标所在行中插入断点(如果当前光标所在行存在断点,则点击该按钮 一次将会把已存在的断点删除)。如果某一行存在断点,则该行最左端会有红色 圆点表示,如图3所示。 |卧lembersjrj mainIlnsQrt/Rwog B】ttinclude main()int nfa9b,c9d,sun0; _入或删除断点 ForQN;3=8 W)|

8、表示一个三位数中的百位 -for(b=8;b=8;b*)表示一个三位数中的十位丄./主二一小=冷納rtrAh木怎在光标所在行播图4开始程序调试图3在程序中插入断点 如何选择在哪一行程序设置断点,这需要开发者的经验和对程序逻辑错误 表象的理解(亦即对程序运行结果不正确的判断)。一般原则是将断点设置在可能 存在逻辑错误代码段的前几行。如果无法把握,则最“笨”的一种方式是将其设 置在程序的开始,如图3所示。在本例中,由于无法从程序运行结果得知程序逻 辑错误可能所在的位置,因此将断点设置在代码的第一行(注意,应该将断点设 置在可执行代码行上,而不应该将其设置在变量定义或是花括号等代码行)。 在设置了断

9、点后,便可进行程序调试。要开始调试,可单击编译微型栏中的 开始调试按钮(或者快捷键F5),如图4所示。点击开始调试后,VC6.0由编辑环 境变为调试坏境,并出现一个调试工具栏。下面简要介绍下VC6.0的调试环境。与代码编辑环境不一样的是,调试环境 下方由上下文窗I I和监视窗I I组成。上下文窗I I会列举出与程序当前所执行到的代码行上下几行所对应的变量的值,图4中上下文窗II显示了与黄色箭头指向的 代码行上下几行对应的变量值(由图中看出a、b、c、d、11、sum的值,其中除了 sum的值为0夕卜,其他变量值均为-858993460。这是因为除sum变量外,其他变 量均为进行初始化或赋值,因

10、此都为随机数)。监视窗II则可对开发者所关注的 变量或表达式的值进行监视,需要监视某一变量,则可在监视窗II空白栏中双击, 输入某一变量名即可。调试工具栏包含用于程序调试的工具按钮,每一按钮功能如卞所述:(仅介绍调试工具栏中的第一行工具按钮)重新开始调试(Restart):重新开始调试按钮将结束本次调试,并重新开始 新的调试,快捷键为Ctrl + Sluft + F5 o在当前本次调试无效果或无法找到错 误时可点击此按钮,开始新的调试。停止调试(Stop Debugging):停止调试按钮将停止程序调试,返回至VC6.0代码编辑坏境,快捷键为Shift + F5。在进行调试后,如发现逻辑错误需

11、要进 行改正,则可点击该按钮。应用代码更改:如果在VC调试环境中对代码进行了更改,可点击该按钮将更改应用于当前调试,而不必重新编译、链接便能继续进行调试,快捷键为Alt + F10o单步进入(Step Into):每点击一次单步进入,程序将执行一行代码,快捷 键为F11。当需要执行的代码中包含函数调用时,点击单步进入则会进入被 调用的函数中执行。单步越过(Step Over):单步越过与单步进入功能相似,每点击一次单步越 过,程序将执行一行代码,快捷键为F10。两者不同的是:当需要执行的代 码中包含函数调用时,点击单步越过不会进入被调用函数中执行(简而言之, 单步越过将函数仅看成一条语句,而单

12、步进入则将函数调用展开)。单步跳出(Step Out):单击单步跳出,程序将执行当前所在函数的所有代 码后,并返回至调用该函数的代码中,快捷键为Shift + Filo该功能与单步 进入配合使用(例如,如果不小心点击了单步进入后,可不必单步执行完所进 入的某一函数,直接点击单步跳出即可返回至调用该函数的代码处,特别是 单步进入了库函数时,该按钮非常管用)。执行至光标所在行(Run to Cursor):单击该按钮,程序将执行至光标所在的 行后暂停下来,快捷键为CU1 + F10。使用该按钮可不必在某个代码行设置断 点,便可使程序在该行暂停下来。在介绍了 VC调试界面后,卞面介绍如何运用程序调试

13、找出逻辑错误。首先分析程序可知,sum用于保存一个数所有的因子之和,代码行if(n= sum)则表 明n为完数。因此我们应该关注变量n及变量sum ,可在监视窗I I中对其进行监 视。由于n由a、b、c三个变量确定,因此可在n = a* 100 + b * 10 +c代码行中 设置断点,具体如图5所示。在进行程序调试时,最重要的一点是开发者需要根据当前变量的值判断当前 执行的代码段对变量的改变是否符合程序编写的预期逻辑。例如在图5中,由于 n=l ,则在执行for(d = 1; d n; d+)循环时,该循坏判断条件dn应该为假,所以 sum的值不会发生改变(仍然为0) o那么接下来的语句if

14、 (n = sum)也应该为假(因为n=l而sum = 0),因此1 不为完数。接着进行调试时,由于我们关注n的值,因此在n = a*100 +b* 10 +c;这行代码中设置断点,并删除原来在for(a = 0; a =8; a+)所在行的断点,具体如图6 所示。图5运行至n = a * 100 + b* 10 + c代码行如图6所示,变量n的值现在为2,程序在foi(d = l;dn;d卄)行停下,由于for循坏的条件是d1也int n ta ,b vc d vsuru0;for(a-0;a-8;a) /a表示、For(b.0;b-8;b) 除不一个三位数中的十位忖厉两圉口陶畀for(c-

15、1 ;c /c示 个三位数中的个卷 n-100db10*c; n表示一个1000以内的数I f odFiF(ntd-O) d表示1axn. cpp口町冈3 file Edit Jfiew Insert trject Qebuc Tools flindw Kelpx茴Rae a 一 tn诸刑zJI H|(Globals)|(All global membersmainB毀J哆蛰出!利酋For(b-i;b b表示一个三位数中的十位For(c-1;c-8;c*) c茨示一个三位数中的个位 n-100a*b10*c; )表示一个riDOD以內的萝 for(d-1;dn;d*)if(n%d= = 0)间

16、的数.如杲能整除5则唸啲一个因子sun=sun*d; su俵不n的因子之和printF(-n-); printFCtd-,n); printFC* its factors are e,);ReadyEC COLIOVR READlf(nsuR)啲因子之和相等,贝I俵明旋一个気数图7变量n=2时,执行完内层for循坏后调试界面图7变Mn=2时,执行完内层fbi循环后调试界面 因为数字6是完数,所以可以尝试查看当n=6时,for(d=l;dn; d+)循环的 执行过程。这时可以按快捷键F5继续调试,由于在n = a* 100 + b* 10 + c代码行 存在断点,因此每按一次F5 ,程序会在该行

17、停下,并且每次n的值会发生变化, 当在监视窗口中查看得n=6时,因再次进行单步调试,进入for(d = l;dn; d+) 循环中,此时调试界面如图8所示。 Project_2 - Kicrosoft Visual C+ break - aain. cpp0Edit Vitv Insert Erojxl fiebuc I01s Jindov Ulp自 of Off_d | (GlobalsJJ|(AII global members j| *main1for(b-a;b-8;b) b税示一个三位数中的十位for(c=1;c=8;c*) c表示一个三位数中的个位n-100a*b*10*c; /n

18、示一个(T1(JO0以内的 For(d-1;dn;d*) 的数.如果n能整除则d是n的一个因子5un-sund; /su峨不n的因子Z和if(n-sun) 如果n与n的因子之和相爭 则表明碇一个完数LidJCftntext: mainQVblue16Namesum6printf(-ne); printfftd.n); printf(- its Factors are ); Project_2 - Kicrosoft Visual C+ break - aain. cpp Project_2 - Kicrosoft Visual C+ break - aain. cppReady图8变an=6时

19、,执行完n=a*100 + b*10 + c语句后的调试界面图8所示为n=6 , d=l时的程序调试界面,由于d6在d=l、2、3、4、5的条件下为真,因此for循坏应该能执行5次,而n=6的所有因子为1、2、3 , 因此执行完这个for循坏后,sum的值应该为6。请注意这时d=l时,sum的值 为多少? sum =6 ,也就是说在未执行for循坏时sum值就已为6。那么执行完for 循环后,sum的值将会是sum=6+1+2+3=12。在n=6时,执行完for循环后,变 量值如图9所示。请注意sum变量的值为12, 11变量的值为6。因为sum变量中保存的是n的因子,因此如果程序正确的话,s

20、um的值因与n的值一致。从而可判断出,逻 辑错误出现在for循环语句附近,仔细观察应该发现,当n为6时,在执行for(d =1; d n; d+)循环前,sum的值已经为6,如图8所示。细心的同学应该明白, 这时sum的值应该是上几次n = 1,2,3,4,5时,所有n的因子之和,如表1所示。这边是程序问题所在,因为每次计算n的因子时,sum仍然保存了上一个n值的 因子之和。因此导致即便n为完数时,sum的值也不是11的因子之和。图9变量26时,执行完for (d = l;dn; d+)语句后的调试界面 图9变量n=6时,执行完for(d= l;dn;d+)语句后的调试界面既然找到该问题所在,

21、那么该如何解决这一问题呢?仔细考虑,可发现,由 于sum保存的是上一个数的因子之和,那么在计算当前11的因子之和前,因首 先将sum的值赋为03具体修改应为在for(d = 1; d n; d卄)循环语句前加sum = 0;,如表2所示。表2修改过表1后的源代码# iiicludemain()iiit n,a,b,c.d,sum=0;for (a=0;a=8;a+)/a表示一个三位数中的百位for (b=0;b=8;b+) /b表示一个三位数中的十位 _for (c=l;c=8;c+) c表示一个三位数中的个位 _n=100*a+b*10+c; /n 表示一个T000 以内的数sum = 0;

22、 /每次求n的因子时,首先将sum赋值为0for (d=l;dn;d+)if (n%d=0) /d表示之间的数,如果n能整除d,则d是n的一个因子sum=sum-rd; /sum表示n的因子之和if (n=sum) /如果n与n的因子之和相等,则表明n是一个完数pnntf(” nM););piintff its factors aie H);for(d=l;dn;d+)if(n%d=0)prmtf(% 4d.d);return 0;重新对程序进行编译链接,这时不必急于再开始调试,而应运行此程序,查 看修改过后的程序运行结果是否正确,运行结果如图10所示。图10改正逻辑错误后,程序的运行结呆查看

23、图10可知,6、28均为完数。现在的疑问是1000以内的完数是否只有6及28?实际上,1000以内的完数还应包括496。因此可判定,程序虽然经过修 改,但其仍然存在逻辑错误。仔细观察表2中的代码发现11的值由a、b、c三个 变量组成,而a、b、c三个变量的范围为08 ,因此n的范围并不是1-999。从 而使得在计算1000以内完数时,遗漏了一些数,而这些数当中包扌舌完数496 o 此外,若要求1000以内的完数,并没有必要用三层循环生成数11,而用一个for 循环便可实现。进一步修改过的程序源代码如表3所示。需要说明的一点是,在表3中求n变量的因子时,内层for循环for(d = 1; d n

24、; d+)被改为了 for(d = 1; d= n/2; d+)。这是为什么呢?举例说明,假设11=500 , 那么当d取值为大于250时,例如251、252等等,这些值不可能为11=500的因 子(很显然,251*2 = 502大于500)。因此在表3中做此修改,可减少内层for循 环的不必要执行次数,从而提高程序的效率。表3最终改正的程序源代码#iiicludemain。mt n,d,sum=0;for (n = 1; n 1000; n+) /n 表示一个1000 以内的数sum = 0; 每次求n的因子时,首先将sum赋值为0for (d= 1;d=ii/2; d+)if (n%d=0

25、) d表示之间的数,如果ii能整除d,则d是n的一个因 子sum=sum+d; /sum表示n的因子之和if (n=suni) /如果11与11的因子之和相等,则表明n是一个完数printf(H nH);pnntf(H%dM 41);printf(H its factors aie ” );for (d=l;dn;d+)if (n%d=0)pnntf(” 4dd);prmtf(n n”);return 0;图11所示为程序最终的运行结果。c E:XGQII2010-2011C_PR0GAIIING-EXPERIIEHT_AS0URCE_C0DEProject_2D.6 its factors

26、are 12328 its factors are 124714496 its factors are 1248163162 124 248r o o uii y ku y c u u u11 c jlhii匕图11最终修改的程序运行结果图总结进行程序调试是程序开发无法绕过的一个过程,然而程序调试对于初学者而 言都存在较大障碍。如何学习并掌握程序调试确实是一件较复杂的爭,作者亦在 学习程序设计的初期对其把握不牢。很多时候往往不得其法,对于一个较简单的 程序调试都花费颇多时间。然而,学习没有任何捷径,只有多练习,细心发现和 挖掘,不断积累经验,最终寻的其入门的诀窍。因此,希望阅读本文的读者能不 断坚持,多练习,不要惧怕进行程序调试,早口能掌握这一开发技能。参考文献1 .2 http:/en.wikipedia. org/wiki Debuggmg.3 http:/en.wikipedia. org/wikiAdnMial_Giace_Hopper.4 http: .

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!