调试技术与异常处理

调试技术与异常处理

ID:1658273

大小:115.50 KB

页数:16页

时间:2017-11-12

调试技术与异常处理_第1页
调试技术与异常处理_第2页
调试技术与异常处理_第3页
调试技术与异常处理_第4页
调试技术与异常处理_第5页
资源描述:

《调试技术与异常处理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、3.1跟踪与中间过程输出也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的DEBUG过程得以缩短。VC开发环境所提供的调试环境是很优秀的,我们可以运用单步运行,设置断点的方法来查找问题所在。但是这种跟踪是非常耗时的,所以我们需要采用一些策略来让我们更容易的发现错误并对错误进行定位,所幸的是VC在这方面提供了强大的支持。在本节中我们先看看如何利用设置断点和利用TRACE宏来输出运行情况。在VC开发环境中按下F9就可以在光标所在行设置断点,再按一次就可以取消该处断

2、点。设置断点的意义在于在调试过程当运行到该行时回产生一个中断并返回到VC开发环境中,在开发环境中你可以查看各个变量的值。下面是我们用于测试的代码,前面有红色圆形的行表示该行设置有断点:在调试过程中到达断点处你可以通过上下文变量窗口(Variables)观察该函数中的变量的值,如果需要观察未在该函数出现的全局变量或者类成员变量这需要将变量名添加到观察窗口(Watch)中输入变量名称。但程序编译完成后请按下F5键以调试的方式执行程序,当进入断点时VC开发环境会被自动激活,然后我们可以可以观察程序的运行情况。在调试过程中也可以

3、添加和删除断点。如下图:如果在运行过程中被观察的变量的值发生了变化则该变量在观察窗中会变为红色。一般来讲设置断点有下面的技巧:·设置在进行判断的代码处,这样可以在运行时可以观察判断所依赖的条件是否正确。·设置函数开始处,观察该函数所依赖的变量是否都设置正确。·设置函数结束处,观察该函数对变量的改变是否正确。·设置进入其他函数前/后,通过黑盒法检查该函数功能是否正确。·对于循环体,应该先测试一个循环次数小的条件来检查循环逻辑是否正确,或者在循环的前几次设置断点,在运行几次后取消断点。MFC中提供的TRACE宏可以帮助我们在

4、程序调试运行过程中方便的输出调试信息。TRACE宏的定义为:TRACE(exp),其中的表达式使用与printf相同的表达方法。例如下面的代码:voidCSam_sp_31Dlg::OnTest2(){staticinti=5,j=50;charszDeb[]="debugstring";TRACE("tracei=%dj=%dstring=%s",i,j,szDeb);i+=1;j+=5;}在以调试方式运行程序是,当你点击TRACE按钮时会看到在调试窗口中输出了调试信息。当程序在调试过程中执行到此处时会在输出窗

5、口输入"tracei=5j=50,string=debugstring"。使用TRACE宏可以让我们随时掌握程序运行过程中变量的变化情况,因为大多数情况下我们都不希望使用断点进入到程序内部,而只是注意运行中数据的值。注意:不要采用TRACE宏一次性输出大批量数据或不间断输出数据,因为这样有可能会时程序运行变得非常缓慢,如:voidtest_trace_e(void){char*pszDeb=newchar[1024*1024];TRACE("%s",pszDeb);//或者for(inti=0;i

6、f(pszDeb);i++){TRACE("%c",pszDeb[i]);}}有一点需要注意的是,TRACE宏在只在调试(DEBUG)版本中起作用,而在发行(RELEASE)版本无效,所以不要在TRACE宏中进行对程序状态进行改变的计算或是调用对状态有改变的函数,例如:voidyourClass::fun1(){TRACE("%d",++m_iTick);//m_iTick状态改变TRACE("returnvalue=%d",DoSomething());}voidyourClass:DoSomething(){if

7、(m_szOut=="No"){returnFALSE;}else{m_szOut="Yes";//状态改变reutrnTRUE;}}在调试中还有一种方法可以将对象内部内容输出到调试窗口中,这就是使用转储(Dump)。转储的实现要通过对象自身实现,在通过对象自身实现时有一个好处就在于可以输入内部受保护层成员。首先CObject类定义了虚函数:virtualvoidDump(CDumpContext&dc)const;当你从CObject中派生新类时你需要重载该函数,例如下面是个很简单的例子:classCMyButton:

8、publicCButton{public:CMyButton();~CMyButton(){};public:#ifdef_DEBUG//由于转储只在调试版本中实现,所以使用条件编译virtualvoidDump(CDumpContext&dc)const;#endifprotected:CStringm_szHot

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。