![Visual C++从入门到精通(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/496/22690496/b_22690496.jpg)
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”。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1739162316-8GNfZJg1qwD1eZe8VPejRcB1EW794lkb-0-5a05230bb9db44752fb1fe76d349fa58)
(2)单击【OK】按钮,弹出【Win32 Console Application】对话框,选中【A simple application】单选按钮。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0047_0002.jpg?sign=1739162316-pkdxdh5QXQMvo2jF6m0393ZiMvOykKCr-0-193310d4c40bfe2c3d01815ad9bb640d)
(3)单击【Finish】按钮,弹出【New Project Information】窗口,显示了本项目的基本信息。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0047_0003.jpg?sign=1739162316-GWp3AYRlwbB4OG4roFFvIolzsJDMHyms-0-296e9a2abdf25571f0b25795d236afdd)
(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 }
【运行结果】
编译、链接、运行,结果如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1739162316-ROA20S4jqiWXHHSBZII71RG6fin4gN0X-0-3ef601cdefe273a8dca0b7a23d5cc0f1)
【范例分析】
这是一个求10以内奇数平方和的小程序。程序本身很简单,下面利用它来演示如何进行程序调试。
1.设置调试环境
(1)设置活动配置。以调试【范例1-2】中的程序为例,编译该程序的“Debug”版本,需要设置“Win32 Debug”配置为活动配置。打开“Sum”项目文件,选择【Build】➢【Set Active Configuration】菜单项,弹出【Set Active Project Configuration】对话框,选择“Sum-Win32 Debug”选项。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1739162316-2FX3PHOJyffPiyrRiL5Bj73bCKlE2SJV-0-d0d66c2bdd5be75c32f79202e7ef36ef)
单击【OK】按钮,即可把Win32 Debug配置设置为活动配置。
(2)设置调试选项和级别。选择【Project】➢【Settings】菜单项,弹出【Project Settings】对话框,选择【C/C++】选项卡,在【Category】下拉列表中选择“General”选项。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0049_0001.jpg?sign=1739162316-QLyrMAx5U7NPDLaLRd58N9RFz4OGM8tJ-0-47eb25edfca30183591e431b4394021f)
其中【, 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.调试工具快捷键
常用的调试工具的快捷键如表所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0049_0002.jpg?sign=1739162316-Ak6Gl2FMb9cjygLRwXtKU8CJ6WP1HWmo-0-e9577aa55f507c33bdc4427b9b6887b9)
1.6.2 调试程序
可以利用上表所示的调试工具快捷键,方便地进行Visual C++应用程序的调试。下面以【范例1-2】中的Sum程序为例,介绍程序调试的方法。
1.设置断点
打开“Sum.cpp”文件,把光标放在代码第7行的开始处,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1739162316-se2WiQPr1oVAIv4mpgOZrqnKugwpFiUU-0-49c70c8068c11a34274caa705dd3f96d)
按【F9】键,即可在第7行的开始处设置断点,再在第11行设置一个断点,断点设置好后会在行开始处的左边显示一个红色的圆点,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0050_0003.jpg?sign=1739162316-yDb1qzTqcJSw2ascp3H1Vh1QbK3bpkWa-0-a6d04a11cc125e2b08b6a70ecf81eba5)
2.单步调试
按【F5】键,程序运行,到第7行的断点处暂停,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0051_0001.jpg?sign=1739162316-3udyzdLNAar4Onwo6yffbNug5xfc5u0o-0-c65c0d17f79925597a508d1ab2b0b4fb)
上图所示的窗口包括了Debug窗口、Memory (内存地址)窗口、Variables(变量)窗口和Watch (查看)窗口。Debug窗口会自动显示出来,其他窗口可选择菜单项打开,如选择【View】➢【Debug Windows】➢【Variables】菜单项,即可打开【Variables】窗口,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1739162316-1kbtHofvd8nQYMkePqJXRuhx3dk4Orjg-0-55289f1da10075a87aab9fac4b25ea99)
当程序运行到第1个断点处,可在【Variables】窗口中看到变量num和sum的值,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0051_0003.jpg?sign=1739162316-pX1K5myYZmfp9UXKClozAWV8oEmiF12Y-0-90ef5b62d0e3b63b5c5e48b9a09f8b67)
它们的值都是0。也可以通过Quickwatch查看运行中的变量值,如图所示。选择num值,变量num高亮显示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1739162316-AjBFuA6eAqVmdERSkmAZRXZ3ETKM8ESJ-0-0ab4533576520e4177df2a1e93675ed0)
右击高亮显示的num,从弹出的快捷菜单中选择【QuickWatch】菜单项,弹出【QuickWatch】窗口,其中显示了num的值,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1739162316-5Z1OTms4TP4cj34FG7OuCoXTvoOlWtQS-0-8fd9630b24e7d12d76f210a19e06a3b2)
按【F5】键,程序继续运行,并在下一个断点处,即第11行暂停。然后按【F10】键,继续进入for循环,再按【F10】键,执行第7行的代码,判断是否为偶数,此时的num值为1,从而执行“continue”语句。把光标放在第11行处,按【Ctrl+F10】组合键,程序将进入下一个循环,然后停止在第11行,此时的num值为2, sum的值为0,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1739162316-pyd05DYB7wqrzlGEBjgIIvBgjGv9ykou-0-eb8fc7fb8721065b531d27e9dcc85dbb)
按【F10】键,执行求和语句,sum的值变为4,从Variables窗口中可以看到sum的值由0变为4,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1739162316-W6NghPNd9GNYwig10cMmVwdetaqMwnQ0-0-6ede6928e9e12f85aaa1f8b4b99585ba)
按【Shift+F5】组合键将中止程序的运行。
3.删除断点
按【Ctrl+B】组合键,弹出【Breakpoints】窗口,在【Breakpoints】列表框中会显示程序中的所有断点,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1739162316-preac1XnOXqWyawKGv2dAMj5JQkp2F31-0-8aa6d4e7f2aec3a9c8e4e8fe076fda7e)
单击【Remove All】按钮,【Breakpoints】列表框中的断点被清空,单击【OK】按钮,这些断点就从程序中完全删除了。直接把光标移到断点处按【F9】键,也可以删除断点。