
1.6 Visual C++ 程序调试
本节视频教学录像:15分钟
Visual C++提供了一个很好的调试环境,能迅速识别问题所在,如可以查看变量内容、内存信息等,极大地方便了我们的调试工作。
1.6.1 调试环境
在编译应用程序的时候,有两种主要的编译器配置:Debug(调试)模式和Release(发行版)模式。在Debug模式下,编译的可执行程序包含了许多调试信息,因而程序相对较大,但便于对程序进行调试。在Release模式下,编译的可执行程序小,编译速度快,但不便于对程序进行调试,Release版本的程序通常是最后提交给用户使用的。
下面来编写一个程序。
【范例1-2】求10以内的偶数的平方和。
(1)在Visual C++窗口中选择【File】➢【New】菜单项,在弹出的【NEW】对话框中选择【Win32 Console Application】工程类型,在【Project name】文本框中输入项目名称“Sum”。

(2)单击【OK】按钮,弹出【Win32 Console Application】对话框,选中【A simple application】单选按钮。

(3)单击【Finish】按钮,弹出【New Project Information】窗口,显示了本项目的基本信息。

(4)单击【OK】按钮,进入项目的编辑界面。选择【File View】选项卡,展开【Sum Files】➢【Source Files】,双击“Sum.cpp”,打开代码编辑窗口,然后输入以下代码。(代码1-2.txt)
01 #incIude"stdafx.h" //预编译指令,包含头文件 02 #incIude"stdio.h" 03 void main(int argc, char*argv[]) //主函数定义 04 { 05 int num=0; //初始化变量 06 int sum=0; //初始化变量 07 for(num=0; num<=10; num++) 08 { 09 if(num%2! =0) //如果是奇数 10 continue; //不做处理,直接进入下一轮循环 11 sum+=num*num; //加上下一个偶数的平方 12 } 13 printf("平方和为%d\n", sum); //输出平方和 14 }
【运行结果】
编译、链接、运行,结果如图所示。

【范例分析】
这是一个求10以内奇数平方和的小程序。程序本身很简单,下面利用它来演示如何进行程序调试。
1.设置调试环境
(1)设置活动配置。以调试【范例1-2】中的程序为例,编译该程序的“Debug”版本,需要设置“Win32 Debug”配置为活动配置。打开“Sum”项目文件,选择【Build】➢【Set Active Configuration】菜单项,弹出【Set Active Project Configuration】对话框,选择“Sum-Win32 Debug”选项。

单击【OK】按钮,即可把Win32 Debug配置设置为活动配置。
(2)设置调试选项和级别。选择【Project】➢【Settings】菜单项,弹出【Project Settings】对话框,选择【C/C++】选项卡,在【Category】下拉列表中选择“General”选项。

其中【, Warning level】 (警告级别)的默认设置为“Level 3”,表示报告所有合理的警告信息。“Level 4”的级别更高,表示尽可能地显示警告信息。“None”不报告任何警告,“Level 1”仅报告严重的错误,“Level 2”可以报告一些不太严重的错误。一般来说,选择“Level 3”。
【Optimizations】(优化)选项设置为“Disable(Debug)”,从而使编译的程序包含更多的调试信息。
如果选中【Warnings as Errors】(作为错误信息的警告)复选框,表明警告信息会被当成错误信息显示出来,停止编译最终的可执行程序。
如果选中【Generate browse info】(生产浏览信息)复选框,表明编译器生成的信息可用来查找函数、类关系等,会增加编译的时间。
【Debug info】 (调试信息)允许设置生成的调试信息级别,默认为“Program Database for Edit and Continue”(用于Edit和Continue的程序数据库),极大限度地保存了调试信息。
【Preprocessor Definitions】(预处理程序定义)指明预处理程序定义,在Debug模式下默认定义了_DEBUG,而在Release模式下没有定义_DEBUG,从而可以利用预定义_DEBUG在Debug模式和Release模式中实现不同的代码处理过程。
在【Project Options】(项目选项)列表框中可以添加附加的编译器设置。
2.调试工具快捷键
常用的调试工具的快捷键如表所示。

1.6.2 调试程序
可以利用上表所示的调试工具快捷键,方便地进行Visual C++应用程序的调试。下面以【范例1-2】中的Sum程序为例,介绍程序调试的方法。
1.设置断点
打开“Sum.cpp”文件,把光标放在代码第7行的开始处,如图所示。

按【F9】键,即可在第7行的开始处设置断点,再在第11行设置一个断点,断点设置好后会在行开始处的左边显示一个红色的圆点,如图所示。

2.单步调试
按【F5】键,程序运行,到第7行的断点处暂停,如图所示。

上图所示的窗口包括了Debug窗口、Memory (内存地址)窗口、Variables(变量)窗口和Watch (查看)窗口。Debug窗口会自动显示出来,其他窗口可选择菜单项打开,如选择【View】➢【Debug Windows】➢【Variables】菜单项,即可打开【Variables】窗口,如图所示。

当程序运行到第1个断点处,可在【Variables】窗口中看到变量num和sum的值,如图所示。

它们的值都是0。也可以通过Quickwatch查看运行中的变量值,如图所示。选择num值,变量num高亮显示。

右击高亮显示的num,从弹出的快捷菜单中选择【QuickWatch】菜单项,弹出【QuickWatch】窗口,其中显示了num的值,如图所示。

按【F5】键,程序继续运行,并在下一个断点处,即第11行暂停。然后按【F10】键,继续进入for循环,再按【F10】键,执行第7行的代码,判断是否为偶数,此时的num值为1,从而执行“continue”语句。把光标放在第11行处,按【Ctrl+F10】组合键,程序将进入下一个循环,然后停止在第11行,此时的num值为2, sum的值为0,如图所示。

按【F10】键,执行求和语句,sum的值变为4,从Variables窗口中可以看到sum的值由0变为4,如图所示。

按【Shift+F5】组合键将中止程序的运行。
3.删除断点
按【Ctrl+B】组合键,弹出【Breakpoints】窗口,在【Breakpoints】列表框中会显示程序中的所有断点,如图所示。

单击【Remove All】按钮,【Breakpoints】列表框中的断点被清空,单击【OK】按钮,这些断点就从程序中完全删除了。直接把光标移到断点处按【F9】键,也可以删除断点。