VC调试方法

合集下载

如何在VC++下调试C程序

如何在VC++下调试C程序

1.启动Visual C++ 6.0后,单击“文件”下的“新建…”2.在“新建”窗口,单击“文件”选项卡,选中“C++ Source File”,在窗口右边的“位置”下输入存储文件夹,或单击右边的“…”按钮选择存储文件夹,然后在上方的“文件名”中输入扩展名为“.c”的程序文件名。

3.在打开的程序窗口中输入源程序,如下所示。

4.单击“文件”下的“保存全部”先保存所有文件。

(该步骤可选)5.单击窗口右上部的“Build”按钮,对文件进行编译、连接和创建可执行文件。

在文件进行编译、连接和创建可执行文件过程中出现的所有窗口,单击“是(Y)”即可。

上述步骤完成后,如果窗口右下部出现的错误数是“0 error(s)”,表示编译成功,否则表示程序有错误,需要“双击”错误处改正程序中的错误。

6.单击窗口右上部的“BuildExecute(Ctrl+F5)”按钮,执行程序,查看结果。

7.程序结果有错误,需要调试程序。

程序结果正确后,单击“文件”下的“保存全部”保存所有该程序有关的所有文件。

8.单击“文件”下的“关闭工作空间”,关闭和该程序有关的所有文件,完成此程序编制、执行、调试等所有工作。

9.如果以后需要继续调试该程序,启动Visual C++ 6.0后,单击“文件”下的“打开工作空间”,找到要打开的工作区文件(文件名和源程序文件名相同,扩展名为“.dsw”),单击“打开”按钮。

如下所示。

如果Visual C++ 6.0此时尚未启动,也可以在“我的电脑”或“资源管理器”中找到相应工作区文件“first.dsw”,双击即可启动Visual C++ 6.0并同时打开该程序工作区等所有文件。

如果双击“first.c”则可启动Visual C++ 6.0并同时打开该源程序文件,但其它文件未打开,也可继续使用。

等级考试就是这样执行的。

VC调试技术

VC调试技术

VC调试技术程序出错的类型大致可以分为两种,语法错误和逻辑错误。

语法错误可以通过编译器的出错信息得到纠正。

然而逻辑错误则不能,所以各大IDE(集成开发环境)中都提供了debug功能,用来分析和排除程序中的逻辑错误,排除逻辑错误的过程又称调试(或debug),下面谨以VC++6.0的调试环境做介绍。

常用的调试命令主要有:step into 命令快捷键:F11单步执行每条语句,在遇到函数的时候,系统将进入函数,单步执行其中的语句。

step over 命令快捷键:F10单步执行每条语句,但在遇到函数时候,系统将把函数当作“一条语句”来执行,自动执行其中的内容,而不进入函数内部单步执行。

run to cursor 命令快捷键:Ctrl+F10系统将自动执行到用户光标所指的语句前。

(这个功能很有用,可以将精力集中到有问题的地方,从而节省调试时间)Go 命令快捷键:F5系统将编译,连接,自动运行程序,但是会在程序设置了断点(breakpoint)处停下。

BuildExcute 命令快捷键:Ctrl+F5系统将编译,连接,运行编译好的程序代码,因此不会在断点处停留,但是在程序执行结束之后,系统会给一个Pause,以方便用户观察输出结果。

Stop debug命令快捷键:Shift+F5本命令是用来终止动态调试过程的。

动态调试的主要方法——watch(监视变量)在程序编译通过以后,当使用了step into,step over,run to cursor, go命令使系统在程序执行的过程中停下之后,系统就会进入调试状态。

调试过程中,你的程序执行窗口会调到后台,而系统窗口中会显示你的程序,其中的黄色箭头指向的是系统下一步将要执行的语句。

而系统窗口下面的那个监视窗口就是我们将要介绍的重点.watch窗口被左右分成了两个部分,左面的那部分我们姑且称之为“自动监视区”(即variable窗口),而右面的我们称之为“手动监视区”。

VC程序调试.

VC程序调试.

VC程序调试VC程序调试调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。

不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。

一、VC程序调试方法 VC的调试功能:首先,再次强调要用Go命令运行一个将要调试的程序;如果要中止调试状态下的运行程序可以点击Stop Debugging命令,还可以通过Break选项以可恢复方式中断调试程序的运行流程(用Restart选项可以重新开始运行程序);Step Into选项表示每次只执行一行语句(单步执行),但如果当前代码是调用一个函数,那么Step Into表示进入该函数,全部函数语句执行完后返回,而Step Over则是跳出这个函数;Step To Cursor 选项表示程序将执行到光标所在的可执行语句行上;在调试多线程程序时,可以在线程函数或主应用程序线程中设置断点,还可以用Break选项结束线程后用Threads选项查看运行线程列表,也可以选择悬挂和恢复每个线程;在设置断点后,在VC "查看"菜单的"调试窗口"中可以查看变量、内存、调用堆栈、寄存器以及反汇编语句。

在程序中设置断点的方法是,点击要设置的代码行并点击设置代码的工具栏按钮,会出现在代码行最左边的一个小黑点即是断点标志,这时再选Go 程序会在执行到端点处停下来,如果要继续执行可以再选Go。

通过选择VC"工具"菜单下的"源浏览器"可以生成一个.BSC文件,使用浏览器可以从中发现多种信息:程序中任何一个变量、函数、类或宏在何处定义及引用;可以列出所有声明的函数类、变量、宏;可以发现调用一个指定函数的所有函数;可以找到一个指定类的派生来源或者它派生出哪些类。

在使用微软程序开发库MSDN时,我们会发现其中的VC示例经常采用看似多余的ASSERT语句,其作用就是使程序具有"维护"性。

使用VC6.0调试程序

使用VC6.0调试程序

结构体类型的定义
struct 结构体类型名 { 类型标识符 成员名1;
类型标识符 成员名2; ……
类型标识符 成员名n; };
如: struct student { char name[10];
long id; char gender; int age; }
注意: struct student 应作为一个类型整体, name[10]、id、gender、age都是其成员。 struct及花括号后的“;”不能省。
a
因此,在C语言中,将地 址形象化地称为指针
2012 35
b
….
2010 p
2012 q
定义一个指针变量
指针变量的定义一般形式为:
基类型 *指针变量名;
例如: int i, j, *pi, *pj; float x, y, *p1, *p2;
指针变量的赋值:使得指针变量指向变量 指针变量名=&变量名;
设有一个函数process,在调用它时,每次实现不同的功 能。输入a和b两个数,第一次调用时找出a与b中的大者,第
二次找出小者,第三次求和。
#include<stdio.h> void main() {int max(int,int); int min(int,int); int add(int,int); int process(int, int, int (*fun)()); int a,b; printf("enter a and b:"); scanf("%d%d",&a,&b); printf("\nmax="); process(a,b,max); printf("\nmin="); process(a,b,min); printf("\nsum="); process(a,b,add); }

VC6.0调试方法

VC6.0调试方法

VC6.0调试⽅法
1.打开你要调试代码的⼯作空间。

2.按快捷键F5或点击以下图⽚上标记的图标进⼊调试模式。

3.打开调试⼯具条,⼀般情况下当你按F5键后会⾃动弹出,如果没有弹出的话,右击⼯具栏空⽩处,会弹出下图,选中调试,就会出现调试⼯具条。

4.接下来,在监视窗⼝中添加你要监视数据变化的变量。

5.按F11逐语句的调试代码,如果某⼀语句是⼀函数,你不希望进⼊该函数时,F10逐过程来查看,在代码的调试过程中,通过监视窗⼝查看变量值的变化,从⽽确定代码是否有问题。

6.如果希望跳出某⼀函数时,按快捷键Shift+F11,或者直接点击调试⼯具条上的按钮就可以跳出该函数了。

7.如果只是希望调试某⼀部分代码的话,可以设置断点来调试,调试⽅法如上,只是在要调试的代码之间⽤断点来分开。

设置断点时,光标放在你要设置断点的那⾏,按F9或点击编译微型条上⾯的类似⼿状的按钮即可。

vc6调试入门教程

vc6调试入门教程

VC6调试入门教程虞铭财本文以OJ上957题简单计算为例介绍VC6的基本调试功能。

题目在《程序设计基础2010》实验三分支结构中。

希望大家把这个代码输入到vc中,跟着本教程多调试几遍,肯定可以掌握调试的基本技巧。

文中如有错误,请指出,不胜感激!!已有代码如下提交到OJ上,判题结果为WA。

虽然用题目的样例输入R1也能得到正确结果19。

但题目中还存在逻辑错误。

对于判题结果为WA的题目,首先大家需要去设计一些测试数据去测试你的程序,看看程序的输出结果是否正确(比对程序输出与自己手工计算结果是否一致),本题还可以设计测试数据,如a1,正确结果应该为f(a)+1=0,但运行程序后结果如下说明对测试数据a1来说,程序给出了错误的结果。

需要找出程序到底哪一行出现了问题。

这个时候需要调试程序。

调试程序的目的就是找出程序中的逻辑错误(希望大家都能明白语法错误和逻辑错误的区别)。

调试的最基本方法主要如下:设置断点、单步执行程序、查看程序中的变量。

1、设置断点从代码上看,显然1-6行是没有问题的。

所以我们在第7行设置断点,如果大家不确定前面的代码是否有问题,可以在main函数的开始处设置断点。

把光标移到第7行的行首,如图所示,光标会在第7行闪烁(图上I字形所在位置)。

然后在工具栏上点击调试按钮,或者按快捷键F9。

这样就在第7行设置好了断点,如图第7行前面有一个红色的圆点。

如果再次把光标移到第7行,然后点击调试按钮或者按F9,则取消断点。

所以按钮或者F9的功能是插入或者删除断点。

备注:断点的作用是使程序在调试的时候,运行到断点所在的行(但是尚未执行该行)的时候暂时把程序停下来,这样就可以程序运行到断点的时候查看变量的值。

2、开始调试设置好断点后,点击工具栏上的开始调试按钮或者按快捷键F5就可以开始调试。

开始调试后如图:大家可以发现在第7行有一个黄色的箭头,表示程序执行到该行了(再次强调一下,该行的代码尚未执行)。

备注:在开始调试后,需要注意如果断点行前有scanf()语句,需要先在程序运行窗口先按题目要求给定程序的输入。

vc 程序调试方法.ppt

调试是一个程序员必须掌握的基本技巧,对于编 写高质量的程序非常重要。
调试可以借助“调试工具条”来进行,“调试工具 条”中的主要命令如图1所示
图1
单步执行(Step Over)
C语言的调试手段主要有:单步执行、设置断 点和运行到光标处,这三种调试手段在实践中 常常结合使用。
1. 单步执行(Step Over) 单击“单步执行(Step Over)”按钮一次,程序 执行一步,如图2所示。在程序调试过程,黄 色右箭头表示当前要执行的代码行,程序执行 的每一步都可以观察变量的值,检查程序的执 行情况。当程序执行完毕,黄色右箭头指向主 函数的“}”位置时,应单击“调试工具条”上 的“停止调试(Stop Debugging)”按钮。
C语言程序的调试方法
在编程过程中,出错是难以避免的,出错并不可 怕,关键是如何尽快找到和排除程序中的错误。
程序错误总体上有两类:语法错误和逻辑错误。 对于语法错误,编译时会产生错误信息,可以根据错 误提示信息加以修改。如果程序编译、连接都没有错 误,但运行结果与预期结果不一致,则需要通过调试 来找出程序中存在的逻辑错误,并加以排除。
设置断点后,单击工具栏上的“进入调试(Go)”按钮,程序运 行到断点处会暂停,此时程序员可以决定接下来是单步执行, 还是继续单击“Go”命令运行到下一个断点。
图3
调试工具条中主要按钮的含义如表1-1所示,其中,Step Into和Step Out的使用与函数相关 .
表1-1 调试工具条中主要按钮的含义
按钮名称 Step Over
单步执行完当停止调试
Run to Cursor 执行到光标处,需要先将光标移动到程序的指定位置
Go
运行程序至断点,需要先设置好断点
Step Into 单步执行,如果当前语句中有函数调用,则单步进入被调用函数

关于VC60中的程序调试技巧

关于VC60中的程序调试技巧调试程序可以帮助的了解程序是怎样运行的。

1、如何快速地规范代码缩进格式选中所需要规范的代码,按hift+F82、如何在Releae状态下进行调试3、Releae和Debug有什么不同。

Releae版称为发行版,Debug版称为调试版。

Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。

Releae版运行速度较快,可执行文件较小,但在其编译条件小无法执行调试功能。

Releae的e某e文件链接的是标准的MFCDLL(UeMFCinaharedortaticdll),比如MFC42.DLL。

这些DLL在安装Window的时候,已经配置,所以这些程序能够在没有安装ViualC++6.0的机器上运行。

而Debug版本的e某e链接了调试版本的MFCDLL文件,如MFC42D.DLL。

在没有安装ViualC++6.0的机器上不能运行,因为缺MFC42D.DLL等,除非选择uetaticdllwhenlink。

4、ASSERT和VERIFY有什么区别ASSERT里面的内容在Releae版本中不编译,VERIFY里面的内容仍然编译,但不再判断真假。

所以后者更安全一点。

例如ASSERT(file.Open(trFileName)),一旦到了Releae版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。

如果用VERIFY()就不会有这个问题。

5、Workpace和Project之间是什么样的关系每个Workpace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting…中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。

6、如何在非MFC程序中使用ClaWizard在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。

vc++6.0_调试详细教程(17种方法)

vc++6.0 调试详细教程Step intoStep overStep outRun to cursorWatchVariablesRegistersMemoryStop DebugCall stackDisassemblyRestart Debugger2、调试的一般过程调试,就是在程序的运行过程的某一阶段观测程序的状态。

在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。

我们所做的第一项工作就是设立断点;其次再运行程序;当程序在设立断点处停下来时,利用各种工具观察程序的状态。

程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向。

下面我们依次来介绍断点的设置,如何控制程序的运行以及各种观察工具的利用。

3、设置断点在VC中,可以设置多种类型的断点,根据断点起作用的方式把这些断点分为三类:1、与位置有关的断点;2、与逻辑条件有关的断点3、与WINDOWS消息有关的断点。

主要介绍前面两种断点。

4、设置位置断点最简单的是设置一般位置断点:¡ 把光标移到你要设断点的位置,当然这一行必须包含一条有效语句的;¡ 然后按工具条上的add/remove breakpoint 按钮或按快捷键F9。

将会在屏幕上看到在这一行的左边出现一个红色的圆点表示这里设立了一个断点5、设置位置断点-图示6、设置逻辑断点有的时候可能不需要程序每次运行到这儿都停下来,而是在满足一定条件的情况下才停下来,这时就需要设置一种与位置有关的逻辑断点。

从EDIT 菜单中选中Breakpoints命令,这时Breakpoints对话框将会出现在屏幕上。

选中Breakpoint对话框中的Location标签,使Location页面弹出。

如下页图所示。

7、8、设置逻辑断点单击上页Condition按钮,弹出Breakpoint Condition对话框,在expression_r编辑框中写出你的逻辑表达式,最后按OK返回。

VC 调试方法总结

条件断点:可以为断点设置一个条件,这样的断点称为条件断点。

对于新加的断点,可以单击Conditions按钮,为断点设置一个表达式。

当这个表达式发生改变时,程序就被中断。

底下设置包括“观察数组或者结构的元素个数”,似乎可以设置一个指针所指向的内存区的大小,但是我设置一个比较的值但是改动范围之外的内存区似乎也导致断点起效。

最后一个设置可以让程序先执行多少次然后才到达断点。

数据断点:数据断点只能在Breakpoints对话框中设置。

选择“Data”页,就显示了设置数据断点的对话框。

在编辑框中输入一个表达式,当这个表达式的值发生变化时,数据断点就到达。

一般情况下,这个表达式应该由运算符和全局变量构成,例如:在编辑框中输入g_bFlag这个全局变量的名字,那么当程序中有g_bFlag= !g_bFlag时,程序就将停在这个语句处。

消息断点:VC也支持对Windows消息进行截获。

他有两种方式进行截获:窗口消息处理函数和特定消息中断。

在Breakpoints对话框中选择Messages页,就可以设置消息断点。

如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。

如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。

Watch工具:VC提供watch工具用于查看变量、表达式和内存值。

单击Debug工具条上的Watch 按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。

注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。

Memory工具:在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC调试方法大全一、调试基础调试快捷键F5:开始调试Shift+F5: 停止调试F10:调试到下一句,这里是单步跟踪F11:调试到下一句,跟进函数内部Shift+F11: 从当前函数中跳出Ctrl+F10: 调试到光标所在位置F9:设置(取消)断点Alt+F9: 高级断点设置跟踪调试1、尽量使用快捷键时行调试2、观察调试信息3、高级中断设置异常调试重试->取消->调试函数堆栈,用variables或者call stack 窗口Release调试1、经常测试你的Debug和Release版本2、不要移除调试代码,如用ASSERT, TRACE等。

3、初始化变量,特别是全局变量,malloc的内存,new的内存4、当你移除某个资源时,确保你移除了所有跟这个资源相关的申明(主要是在resouce.h文中)5、使用3或者4级的警告级编译你的代码,并确保没有警告,project->setting->c/c++->warninglevel(中文版是项目->属性->C/C++->常规->警告等级) 6、 _debug改成NDEBUG进行调试,project->setting->C/C++->Preprocessordefinitions(中文版是项目->属性->C/C++->预处理器->预处理定义)(这里是debug和Release编译的重要不同之一)7、在Release中调试源代码,project->setting->C/C++->debug info选择programDataBase (中文版是项目->属性->C/C++->常规->调试信息格式->用于“编辑并继续”的程序数据库),project->setting->link选上Generate debug info(中文版是项目->属性->链接器->调试->生成调试信息)8、走读代码,特别关注堆栈和指针二、TRACE宏当选择了Debug目标,并且afxTraceEnabled变量被置为TRUE时,TRACE宏也就随之被激活了。

但在程序的Release版本中,它们是被完全禁止的。

下面是一个典型的TRACE语句:…int nCount =9;CString strDesc("total");TRACE("Count =%d,Description =%s\n",nCount,strDesc);…可以看到,TRACE语句的工作方式有点像C语言中的printf语句,TRACE宏参数的个数是可变的,因此使用起来非常容易。

如果查看MFC的源代码,你根本找不到TRACE宏,而只能看到TRACE0、TRACE1、TRACE2和TRACE3宏,它们的参数分别为0、1、2、3。

个人总结:最近看网络编程是碰到了TRACE语句,不知道在哪里输出,查了一晚上资料也没找出来,今天终于找到了,方法如下:1.在MFC中加入TRACE语句2.在TOOLS->MFCTRACER中选择“ENABLE TRACING”点击OK3.进行调试运行,GO(F5)(特别注意:不是执行…!‟以前之所以不能看到TRACE内容,是因为不是调试执行,而是…!‟了,切记,切记)4.然后就会在OUTPUT中的DEBUG窗口中看到TRACE内容了,调试执行会自动从BUILD窗口跳到DEBUG窗口,在那里就看到TRACE的内容了,^_^以下是找的TRACE的详细介绍:==============================TRACE宏对于VC下程序调试来说是很有用的东西,有着类似printf的功能;该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调式也在RELEASE的时候减少代码量。

使用非常简单,格式如下:TRACE("DDDDDDDDDDD");TRACE("wewe%d",333);同样还存在TRACE0,TRACE1,TRACE2。

分别对应0,1,2。

个参数TRACE信息输出到VC IDE环境的输出窗口(该窗口是你编译项目出错提示的哪个窗口),但仅限于你在VC中运行你的DEBUG版本的程序。

TRACE信息还可以使用DEBUGVIEW来捕获到。

这种情况下,你不能在VC的IDE环境中运行你的程序,而将BUILD好的DEBUG版本的程序单独运行,这个时候可以在DEBUGVIEW的窗口看到DEBUGVIE格式的输出了。

VC中TRACE的用法有以下四种:TRACE1 ,就是不带动态参数输出字符串, 类似C的printf("输出字符串");TRACE2: 中的字符串可以带一个参数输出 ,类似C的printf("...%d",变量);TRACE3:可以带两个参数输出,类似C的printf("...%d...%f",变量1,变量2);TRACE4 可以带三个参数输出,类似C的printf("...%d,%d,%d",变量1,变量2,变量3); TRACE 宏有点象我们以前在C语言中用的Printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态。

但有一点不同的是:TRACE 宏只有在调试状态下才有所输出,而以前用的Printf 函数在任何情况下都有输出。

和Printf 函数一样,TRACE函数可以接受多个参数如:int x = 1;int y = 16;float z = 32.0;TRACE( "This is a TRACE statement\n" );TRACE( "The value of x is %d\n", x );TRACE( "x = %d and y = %d\n", x, y );TRACE( "x = %d and y = %x and z = %f\n", x, y, z );要注意的是TRACE宏只对Debug 版本的工程产生作用,在Release 版本的工程中,TRACE宏将被忽略。

三、ASSERT宏如果你设计了一个函数,该函数需要一个指向文档对象的指针做参数,但是你却错误地用一个视图指针调用了这个函数。

这个假的地址将导致视数据的破坏。

现在,这种类型的问题可以被完全避免,只要在该函数的开始处实现一个ASSERT测试,用来检测该指针是否真正指向一个文档对象。

一般来讲,编程者在每个函数的开始处均应例行公事地使用assertion。

ASSERT宏将会判断表达式,如果一个表达式为真,执行将继续,否则,程序将显示一条消息并且暂停,你可以选择忽视这条错误并继续、终止这个程序或者是跳到Debug器中。

下面一例演示了如何使用一个ASSERT宏去验证一个语句。

void foo(char p, int size ){ASSERT( p != 0 ); //确认缓冲区的指针是有效的ASSERT( ( size >= 100 ); //确认缓冲区至少有100个字节// Do the foo calculation}这些语句不产生任何代码,除非—DEBUG处理器标志被设置。

Visual C++只在Debug版本设置这些标志,而在Release版本不定义这些标志。

当—DEBUG被定义时,两个assertions将产生如下代码://ASSERT( p!= 0 );do{if( !(p !=0) && AfxAssertFailedLine(—FILE—,—LINE—) )AfxDebugBreak();}while(0);//ASSERT((size 〉= 100);do{if(!(size 〉= 100) &&AfxAssertFailedLine(—FILE—,—LINE—))AfxDebugBreak();}while(0);Do-while循环将整个assertion封装在一个单独的程序块中,使得编译器编译起来很舒畅。

If语句将求取表达式的值并且当结果为零时调用AfxAssertFailedLine()函数。

这个函数将弹出一个对话框,其中提供三个选项“取消、重试或忽略”,当你选取“重试”时,它将返回TRUE。

重试将导致对AfxDebugBreak()函数的调用,从而激活调试器。

AfxAssertFailedLine()是一个未正式公布的函数,它的功能就是显示一个消息框。

该函数的源代码驻留在afxasert.cpp中。

函数中的—FILE—和—LINE—语句是处理器标志,它们分别指定了源文件名和当前的行号。

AfxAssertFailedLine()是一个未正式公布的函数,它的功能就是显示一个消息框。

该函数的源代码驻留在afxasert.cpp中。

函数中的—FILE—和—LINE—语句是处理器标志,它们分别指定了源文件名和当前的行号。

四、VERIFY 宏因为assertion只能在程序的Debug版本中起作用,在表达式中不可以包含赋值语句、增加语句(++)或者是减少语句(--),因为,这些语句实际改变数据。

可有时你可能想要验证一个能动的表达式,使用一个赋值语句。

那么就到了用VERIFY宏来替代ASSERT。

例如:voidfoo(char p, int size ){char q;VERIFY(q = p);ASSERT((size 〉= 100);//Do the foo calculation//Do the foo calculation}在Debug模式下,ASSERT和VERIFY是一回事,但是在Release模式下,VERIFY宏仍然测试表达式而assertion却不起任何作用。

可以说,在Release模式下,ASSERT语句被删除了。

请注意,如果你在一个ASSERT语句中错误地使用了一个能动的表达式,编译器将不做任何警告地忽略它。

在Release模式下,该表达式就会被无声息地删除掉,这将会导致程序的错误运行。

由于Release 版的程序通常不包含Debug信息,这类错误将很难被发现。

五、VC高级调试方法-条件及数据断点的设定(一)位置断点(LocationBreakpoint)大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。

但对于很多问题,这种朴素的断点作用有限。

譬如下面这段代码:void CForDebugDlg::OnOK(){for(int i = 0; i < 1000; i++) //A{intk = i * 10 - 2; //BSendTo(k); //Cinttmp = DoSome(i); //DTrace0("这里要输出的内容”);//在这里可以输出一些有用的信息,你也可以输出I的值,都是可以的intj = i / tmp; //E}}//其实我们还可以用其他方法调式也是一样的,你可以用TRACE0宏来输出循环中的每一个结果,我们也可以在debug中看见输出的结果,当出现问题时,输出的结果可能就不一样了,我们可以分析一下debug中的结果找出问题的所在执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。

相关文档
最新文档