2023年12月29日发(作者:)
・64・ (总660) VS2008的IDE环境中对应用程序进行调试的方法 2012拒 文章编号:1003—5850(2012)08—0064—03 VS2008的IDE环境中对应用程序进行调试的方法 唐婧,赵武初 415000) (常德职业技术学院,湖南 常德摘要:VS2oo8是当前软件开发常用的开发环境,其中在VS2008IDE下进行程序的开发,程序开发人员可以很好地利用该开 发环境所继承的应用程序调试工具进行程序的调试工作。从对VS20O8的开发环境的介绍谈起,就VS20O8的IDE环境中对应用程 序进行调试的方法进行了说明,最后对VS2O08的IDE环境中应用程序进行调试的步骤进行了分析。 关键词:VS2oo8 IDE,应用程序,调试 中图分类号:TP311.52 文献标识码:A Analysis of Program Debugging Methods in IDE Environment of V¥2008 TANG Jing,ZHAO Wu—ehu (Changde Vocational Technical College,Changde 415000,China) Abstract:V¥2008 is development environment which is used in software development.Under the V¥2008 IDE program development,programmers can make good use of application debugging tools for debugging work.In the paper,VS2008 development environment is introduced,then debugging methods for application program are explained in VS2008 IDE environment,finally debugging steps are analyzed in VS2008 IDE environment. Key words:VS2008 IDE,application program,debugging 程序的错误通常可以分为若干类,语法错误、链接 错误、逻辑错误。语法错误是比较容易查找并且修改 的,而且编译给出的提示信息也比较完整,所以容易修 持.NET framework 3.5,并且对以前.NET framework版本进行支持。同时,在VB3.5和c#3.5 中加入了对LINQ的支持。LINQ使用户能够使用VB 和C#编写出类似于SQL语句这样的指令,使得开发 语言和数据库语言彼此能够结合起来。另外,在软件过 程管理中,Visual Studio 2008引入了CODE 改。链接错误来源很多,常常由于和系统、库函数等方 面的原因出错,难以一言蔽之。最后是逻辑错误,这是 程序开发人员在进行程序开发时所碰到的难点,因为 系统没有给出明确的提示,程序开发人员也只是知道 MATRIX,可以测量代码的复杂度,对代码的性能进 行定量的分析,从而对代码的优劣有一个比较深入的 了解。 1.2 VS2008开发环境说明 1.2.1 VS2008开发环境介绍 运行错误,那么如何找到并修改运行错误就非常重要。 1 认识V¥2008及其开发环境 1.1 VS2008概述 Visual Studio一直是广大程序员所关注的重要 的软件开发平台。目前,大家可以从微软网站下载 Visual Studio 2008 bate2版本。Visual Studio 2008支 VS2008的IDE环境和以前相比更加强大,而且 将VC、VC#、VB的开发界面全部都集中到一起,建 立一个以解决方案为依托的代码项目组织。其中 * 收稿日期:2012—03—05,修回日期:2012-06—20 ** 基金项目:2011年度科技厅科学研究项目(2011FJ4170) ***唐婧,女,1980年生,硕士,研究方向:计算机软件工程。
第25卷第8期 电脑开发与应用 VS2008的IDE主要由菜单与工具条、属性窗口、帮助 功能、对话框资源编辑、资源编辑、图片,图标编辑、代 码编辑等所组成。 1.2.2 关于VS2008开发环境中的程序调试工具 j J j t 4-3-;一 L , : 。 s e _ I - : -j l,、 .宝 石萄j i 雨_ ̄n(iar 一……洲 …… ]) Win ̄2cProj 。 q ’buc 一 支件 bucket1 insertEl e-(1.1) Bucke ̄h bucket1 insert81e1(2.2J P aye r h ¨1 publ;c h bucketi printAli0, 图1 VS2008程序蒯试工具 图1中的1位置是调试常有的工具按钮,2位置 的箭头指示的是当前程序运行到的位置。 工具按钮中8个按钮分别是:①是继续运行(F5, 会运行到下一个断电停止,如果没有断点,则运行到结 束);②是停止运行(不结束程序ctrl+shift+F5); ③是结束运行(结束程序调试shift+F5);④是重新启 动;⑤是显示下一个语句;⑥是运行到函数内部(如果 当前语句是一个函数)(F11);⑦是运行到同层的下一 条语句(F10);⑧是跳出当前函数(shift+Fl1)。 2 VS2008的IDE环境中对应用程序 进行调试的方法 2.1断点调试法 最简单的一种,设置一个断点,程序执行到那一句 就自动中断进入调试状态。其中又可以分为单步执行、 监视以及条件中断3种不同的断点调试法。 2.1.1 单步执行 有3种,一种是每次执行一行,但遇到函数调用就 会跳到被调用的函数里;一种是直接执行当前函数里 剩下的指令,返回上一级函数。在Visual Studio中,上 面3种方法对应的快捷键分别为F10、Fll、Shift+ F1l。 2.1.2监视 调试器可能会自动列出一些相关变量的值,但是 你可能还关心其他变量的值,可以添加对这些变量的 监视。还可以监视一个表达式的值,比如a十6。但是, 这个表达式最好不要修改变量的值,比如监视n++ 都会导致监视时修改了n的值,影响了程序的运行结 果。 2.1.3 条件中断 假如你有这样的循环: for(int i:=0;i<100;i++){ for(int i一0;i<100;j++){ ) ) 如果怀疑当i一10且J一10的时候执行有问题, 那如何调试?用断点的话,从i一0的初始状态,需要中 断10次才能到 一10,然后从J一0也需要再中断1O 次,才能到J一10的状态。所以想进入i一10且j.—1O 的状态,需要中断2O次,这太麻烦了。可以使用条件中 断: for(int i一0;i<l00;i++){ for(int j=0;j<lo0;j++){ if(i一一lO&&j=一lO){ ; ) , } 在空语句的那一行设置断点就可以了。上面的if 结构太占地方,还可以用assert: assert( !一10 l l !一10);断点i不为1O或J不 为10,那么当i一10且J一10的时候,断点就不成立, 程序就会中断,进入调试状态。有时候用throw也可以 中断:if(i一一10&&J:==一10)throw。但是最好不要这 样做,调试器不一定会在throw的地方中断。 2.2控制变量调试法 控制变量法常用于科学研究中,比如说,研究牛顿 第二定律n—F/ ,a与F和 都有关,那么可以先固 定棚,研究n与F的关系;然后固定F,研究 与a的 关系。 对于一个程序来说,一个bug可能跟多处代码有 关。假如你怀疑这个bug与某些语句有关,可以把这 些语句注释掉,或者是改一改,看看bug是否还存在, 如果不存在,说明确实跟这些语句有关。当然,要保证 程序少了这些语句之后还可以顺利运行。如果hug还 存在,就说明它跟这些语句无关。 有些时候我们缺乏调试工具,比如在网页上运行 的程序,在特殊设备上运行的程序,那么控制变量法是 一种很有用的代替手段。 2.3二分法调试法 二分法是控制变量法的进一步扩展。在数学上,二 分法用于求一个连续函数的根。比如一个函数for), 如果f(z1)>0且f(z2)<O,那么在区间xl和x2之 间,必定存在一个.72,使厂(z)一0。然后我们再考察区 间的中点x3一(xl+x2)/2,如果f(x3)>0,则函数 的根就在区间z3和z2之间,如果f(x3)<0,那么函 数的根就在区间z1和x3之间。如此不断地把区间一
VS2008的IDE环境中对应用程序进行调试的方法 分为二,最后锁定函数的根。 而现在这个程序的输出结果却是2,1,和我们预想的 不符合,说明程序设计过程中存在逻辑上的错误,也就 是算法设计的问题。 3.2应用程序调试的步骤 3.2.1确定错误的大概位置 对于一个程序来说,如果当前情况是有bug的, 那就好比是f(x1)>0;如果你把main函数里所有的 操作都注释掉,那么程序什么都不做,就不可能有 bug,那就好比是f(x2)<O;于是在这两种状态之中, 肯定存在一些临界的语句,当这些语句改动的时候, 就会使程序在有bug和无bug状态间切换,这些语句 就是bug的原因所在。运用二分法的思想可以锁定这 些临界语句。一开始先对程序做一些大刀阔斧的改动, 接下来第1步就是要发现问题。程序就那么几句, 很明显,调试需要做的第1步就是确定错误的大概位 置。按F10,运行到bucket1.insertElem(2,2),这时候 箭头指向该语句,表示该语句前面的语句都运行完成, 比如说,程序的主循环会循1O次,就改成1次;程序有 1O个功能,就关掉5个功能。看看哪些改动,可以让程 序由bug状态切换到无bug状态。找到这样改动后, 就把这个改动再细分成几个小改动,比如关掉5个功 能,就细分为关掉一两个功能,再看看哪些小改动可以 让程序由bug状态切换到无bug状态。如此一步一步 缩小包围圈,然后锁定一个无法再分的小改动,这个改 动就是bug的原因所在。 2.4同步法调试法 有些bug是由于多线程而产生的。因为在不同线 如 一_.c、L●__一国 ,[≈~ 如惭K. 虹程里的操作我们无法预测其发生的顺序,可能当它们 儿e 按某种次序进行时,bug不会出现,当它们按另一种次 如b 协 {l 序进行时,bug就出现了。比如多线程中提到的那个银 行账户,如果没有加同步锁,就会出现这种bug。对这 种bug的调试是很困难的,有时你运行程序发现了 bug,而在进行调试的时候,由于执行顺序不同,bug又 不出现了。 为了解决这个问题,我们想了一个办法,就是利用 同步事件,强行把多线程的程序按照预定好的顺序去 执行。比如说有两个线程,一开始就让线程1运行,线 程2睡觉,线程1运行到某个特定的点后,就换线程2 运行,线程1睡觉。任何时候,都只有一个线程可以运 行。我们可以在多次运行的过程中使用不同的执行顺 序,如果按某种执行顺序运行之后bug浮现了,那么 就把这种顺序记录下来。然后按照这种顺序进入调试, 找出bug。 3 V¥2O08的IDE环境中对应用程序 进行调试的步骤分析 本文结合具体的实例,就VS2008的IDE环境中 对应用程序进行调试的步骤进行分析。 3.1实例说明 一个链表的程序,包括主程序Win32 C Proj.cpp文件,Bucket.h和Bucket.cpp,其中Bucket 用链表的方式实现一个容器。运行该程序,我们要的结 果是1,2,因为是在第1位置插入1,第2位置插入2。 但是该语句还未运行,显示的监视窗口如图2所示。 苎 . 目!! 上 监观1 名称 值 {next-( ̄a:O158t98data--858993460> OxO0158198{nen—0x00∞D∞O dab-1’ OxO0000000{ xt- 对data*?P?) l {589g3460 Oxcccccccc O xt一 da ̄s-?P;') C.X*C ̄3I 借供 漫有找到符吕 ( et2 : x。。17谘误最甫找到符号 J’ 粤 : 一 二 萼 气: 二 一…… 望妻塑 塑 堡! 鱼 j 堡竺i罚 1】 图2监视窗1:2 Bucket1变量展开之后可以看到,它包含size一1, head节点和currentNode。Head节点展开,其值data 为一858 993 460(这个区域对链表头而言没有用),next 又指向一个节点,所指节点值为1,next为空。这些结 果和预期的一致,说明到目前为止没有发现错误。再按 F10,运行的窗口监视变化为图3。 n_+ 一 一 -Ⅲ __ 一一一一~一..一,-■一 1名称 I值 f ̄ze=2 head {…}a ode=0xcccccc“) 2 {next-OxO0158le0 data ・858993460} 0 ̄001S81e0.[next=OxO0158198 data=2) Ox0o158198{next=OxO0000000 data=” OxO0000000 01extt ”da ̄=P?P) 1 2 -858993460 OXCCCCCCCC0.Iex 由|a= ) 图3变化的监视面I:1 从这里观察head的next指向的节点值是2,2,这 个节点指向的值是1,很明显应在第2个位置插入2, 而不是第1个位置。因此可以断定刚才执行的这个语 句有问题。 3.2.2深入发现问题 在初步发现问题InsertElem函数之后,接下来重 新开始,并且在发现错误的这条语句上加断点(光标停 留在该语句行,并且按F9),效果如图4所示。 这样设置的目的是便于直接运行到该位置,特别 在程序比较长的时候,如果再次从头一步一步运行非 (下转第69页)
第25卷第8期 电脑开发与应用 是提供进行游戏的界面设计,并提供相关的辅助的开 发工具。 客户端的列表,列表中有一个布尔参数表示是否支持 多播功能,服务器端通过检查setsockone()函数返回 游戏的运行流程如下: creatGameWindows();//初始window窗口 creatDraw(hWnd);//初始化图像引擎 creatSound();//初始化声音引擎 creatAvi();//初始化AVI引擎 的值来判断终端用户是否支持多播功能。 3 结束语 游戏产业的不断发展,为人们的业余生活,带来了 丰富的体验,有些游戏,甚至对于玩家的智力开发,起 到积极的作用,游戏引擎的开发作为游戏开发的核心 部分,其关键技术与研究,以及引擎的优化,一直是游 戏厂商及整个IT行业关注的焦点,本文基于Winsock 提供了一种可行的开发方向,期望能在游戏引擎的开 creatNet();//初始化网络引擎 LoadGameData();//读取游戏定义数据,包括资源定义文 件和游戏定义,界面定义 While(1) { WINTraceMsg();//处理系统消息,比如鼠标,键盘 GameTimeTarce();//处理活动的游戏页的时间反应 Winpaint()://刷新游戏显示 outToScr(); 发道路上成为业界可供参考的技术。 参考文献: Frank D Luna.DirectX 9.0 3D游戏开发编程基础 } [M].北京:清华大学出版社,2007. Cheah T C S.Ng K W.A Practical Implementation of ] 除游戏的创意以外,游戏引擎是游戏开发的核心 L二j 部分,其开发不仅影响到游戏的可玩性,也影响到游戏 ] 口 ] ] ne[C]//I] a 3D Game Enginternational Conference on Computer Graphics,Imaging and Vision(CGIV’05), 2005. 的性能、交互等各个方面。因此在设计时需要考虑到多 操作系统,与其他软件的兼容性,对硬件的要求问题等 各个方面,以保证游戏能够在不同的网络环境和用户 终端能够正常地运行。 Stefan Zerbst,Oliver Duve1.3D Game Engine Programming[M].New Jersey:Premier Press,2004. 耿卫东.三维游戏引擎设计与实现[M].杭州:浙江大 学出版社,2008.11. 使用Winsock添加多播支持,可使游戏多人同时 使用,在实现的过程中,可以将游戏的原代码与多播支 持功能分开,增加一个可以选择的功能,使用者可以根 王树军.三维游戏弓l擎中物理引擎关键技术的研究 [D].天津:天津大学,2007. 据自己的需求进行选择。游戏的服务器端会保存所有 (上接第66页) lnt一… ㈡ { h { 初始值改为1便可。至此,我们解决了一个逻辑错误。 g J℃ … ‘ //首先申明~些变量 当然算法如果还有其他的错误,则还需要进一步发现。 Cl3ucket<int>bucketl : 一h }bbuc k etll,lin s…ertEg1le  ̄ (12.,21) ; : bu4 结束语 程序在设计时难免会遇到各种各样的错误和问 题,如何找到程序的错误所在,然后采用合适的调试方 法进行程序的调试,解决存在的问题,是程序设计人员 所必须面对的问题。本文以VS2008开发环境中的程 序调试为例,对程序调试的方法和步骤进行分析,希望 cke pr1ntAll(). 图4效果图 常耗时间,所以这里设置断点,然后按F5可以直接运 行到该位置。这时候就需要进一步考察该函数的运行 了,因为已经断定这里存在错误。用F11让程序运行 进入到该函数内部,接着按照前面的方法用F10让程 能对同行有所借鉴和帮助。 参考文献: [1] 郭树文.VS.NET中对应用程序进行调试的方法和步 骤[J].赤峰学报(自然科学版),2010(3):26—28. 序在该层逐步运行,并且对比你所预期的结果和程序 运行的结果,如果不一致,便发现问题了。在本例中,要 在第2个为止插入节点,那么for语句应该执行一次, 让P移动,而在执行过程中发现,for语句没有进入内 部执行,直接到如下为止,因此可以断定此处存在和预 期不符合的情况。再仔细推敲,很容易发现问题:for语 句中的k初始为2导致 没有向后移动。 3.2.3 解决问题 E2] 黎远松.基于VS2008的分组验证功能实现[J].电脑 编程技巧与维护,2010(10):11-12. [3] 龚新文.串口通信在VS2008中的实现应用rJ].电脑 与电信,2011(3):47—48. [4] 支和才.基于VC2008的ASP.NET访问数据技术的 浅析[J].商情,2011(16):129—130. 发现问题后加以解决就非常方便了,只要把k的


发布评论