![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=1738975777-uxGJTOKKg4GfEZ1espfDVVNISAwe5Kga-0-0f29b19a034f6bf5cc1ea469d0c7a44f)
(2)单击【OK】按钮,弹出【Win32 Console Application】对话框,选中【A simple application】单选按钮。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0047_0002.jpg?sign=1738975777-PqW6Zrykxk1P03UR2wanqUJhGCJVir3I-0-703f063d29b1f7f5cd1ec1caa7253d7c)
(3)单击【Finish】按钮,弹出【New Project Information】窗口,显示了本项目的基本信息。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0047_0003.jpg?sign=1738975777-QzzkT28we5Z2AGx1L5r38wvyRHJcZZCS-0-447e941835947ffa05be60ac50be861c)
(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=1738975777-2OtSteJT8VUxhp2UWTfq4IHKpWYLQHue-0-0509255b82065419e4d1b5b014af2c94)
【范例分析】
这是一个求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=1738975777-ZXRpg7QcmE7SYiaEqd9oDNiEI1iiaVq4-0-4be95c1f8248dbe62746ed6a79520519)
单击【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=1738975777-K3X7DIPz79TdhP7WOsoHjON6bcUGog54-0-2d5635f7ec59c755c11b31a0a00d6582)
其中【, 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=1738975777-QhTYDgVUc4UpNKIFbRYQZIWb8bATxeiu-0-d361db41d481c159e84498db1c672db9)
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=1738975777-mYIavGotEUtQMQP9UbiCWHSfbATIeccp-0-8e50f67bcbdaae6ec5c982d801c5ab65)
按【F9】键,即可在第7行的开始处设置断点,再在第11行设置一个断点,断点设置好后会在行开始处的左边显示一个红色的圆点,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0050_0003.jpg?sign=1738975777-sW93TgNPJMpRdMvWqkUFwAJvT0btvgAn-0-c183037214254965a8b18f64f98881b0)
2.单步调试
按【F5】键,程序运行,到第7行的断点处暂停,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0051_0001.jpg?sign=1738975777-MC6jj3KeKoHJAMvPGg1E59BRhSStmMwC-0-033139c8658fa235fcb6638f64af9422)
上图所示的窗口包括了Debug窗口、Memory (内存地址)窗口、Variables(变量)窗口和Watch (查看)窗口。Debug窗口会自动显示出来,其他窗口可选择菜单项打开,如选择【View】➢【Debug Windows】➢【Variables】菜单项,即可打开【Variables】窗口,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1738975777-DfTgiKi0ikLjVLPK54Zy7oD6CKduodEC-0-8766812cd2524fb9ab50eedb02f01723)
当程序运行到第1个断点处,可在【Variables】窗口中看到变量num和sum的值,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0051_0003.jpg?sign=1738975777-gLpumhoyZakQyVqF0VuqKycJ6rCmISkr-0-1d39d10f1b4e898cccdbcb6a095879d6)
它们的值都是0。也可以通过Quickwatch查看运行中的变量值,如图所示。选择num值,变量num高亮显示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1738975777-SXEt8wQlHc6K6DCNwVzDQAFDLAbi8AJL-0-bf81df30059c2e1df6616b08f12a8584)
右击高亮显示的num,从弹出的快捷菜单中选择【QuickWatch】菜单项,弹出【QuickWatch】窗口,其中显示了num的值,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1738975777-5pehfKDz7A11k1fiAMGOAHlUJELd3zS6-0-2eb3380c3831342c1c4c53f4af4687be)
按【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=1738975777-hCbkMA5SG4xrGwVWztcRvCcZjxR5r6DS-0-1b19d433b4a762ab04d34c43626dadd5)
按【F10】键,执行求和语句,sum的值变为4,从Variables窗口中可以看到sum的值由0变为4,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1738975777-N0wvpS2AkTlAZjoULCkrcYLDpYOmSJwR-0-1864f6b30957c94313d80e0170c57906)
按【Shift+F5】组合键将中止程序的运行。
3.删除断点
按【Ctrl+B】组合键,弹出【Breakpoints】窗口,在【Breakpoints】列表框中会显示程序中的所有断点,如图所示。
![](https://epubservercos.yuewen.com/CADD52/11261864704947406/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1738975777-Y0we9aPIIcaAYhkworPJqgZG5kzpd1Lj-0-5006ce16368a07ee60eedc939287ff90)
单击【Remove All】按钮,【Breakpoints】列表框中的断点被清空,单击【OK】按钮,这些断点就从程序中完全删除了。直接把光标移到断点处按【F9】键,也可以删除断点。