3.1跟踪与中间过程输出也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的DEBUG过程得以缩短。VC开发环境所提供的调试环境是很优秀的,我们可以运用单步运行,设置断点的方法来查找问题所在。但是这种跟踪是非常耗时的,所以我们需要采用一些策略来让我们更容易的发现错误并对错误进行定位,所幸的是VC在这方面提供了强大的支持。在本节中我们先看看如何利用设置断点和利用TRACE宏来输出运行情况。在VC开发环境中按下F9就可以在光标所在行设置断点,再按一次就可以取消该处断点。设置断点的意义在于在调试过程当运行到该行时回产生一个中断并返回到VC开发环境中,在开发环境中你可以查看各个变量的值。下面是我们用于测试的代码,前面有红色圆形的行表示该行设置有断点:在调试过程中到达断点处你可以通过上下文变量窗口(Variables)观察该函数中的变量的值,如果需要观察未在该函数出现的全局变量或者类成员变量这需要将变量名添加到观察窗口(Watch)中输入变量名称。但程序编译完成后请按下F5键以调试的方式执行程序,当进入断点时VC开发环境会被自动激活,然后我们可以可以观察程序的运行情况。在调试过程中也可以添加和删除断点。如下图:如果在运行过程中被观察的变量的值发生了变化则该变量在观察窗中会变为红色。一般来讲设置断点有下面的技巧:设置在进行判断的代码处,这样可以在运行时可以观察判断所依赖的条件是否正确。设置函数开始处,观察该函数所依赖的变量是否都设置正确。设置函数结束处,观察该函数对变量的改变是否正确。设置进入其他函数前/后,通过黑盒法检查该函数功能是否正确。对于循环体,应该先测试一个循环次数小的条件来检查循环逻辑是否正确,或者在循环的前几次设置断点,在运行几次后取消断点。MFC中提供的TRACE宏可以帮助我们在程序调试运行过程中方便的输出调试信息。TRACE宏的定义为:TRACE(exp),其中的表达式使用与printf相同的表达方法。例如下面的代码:voidCSam_sp_31Dlg::OnTest2(){staticinti=5,j=50;charszDeb[]="debugstring";TRACE("tracei=%dj=%d\nstring=%s\n",i,j,szDeb);i+=1;j+=5;}在以调试方式运行程序是,当你点击TRACE按钮时会看到在调试窗口中输出了调试信息。当程序在调试过程中执行到此处时会在输出窗口输入"tracei=5j=50\n,string=debugstring\n"。使用TRACE宏可以让我们随时掌握程序运行过程中变量的变化情况,因为大多数情况下我们都不希望使用断点进入到程序内部,而只是注意运行中数据的值。注意:不要采用TRACE宏一次性输出大批量数据或不间断输出数据,因为这样有可能会时程序运行变得非常缓慢,如:voidtest_trace_e(void){char*pszDeb=newchar[1024*1024];TRACE("%s\n",pszDeb);//或者for(inti=0;i