诊断服务
微软基础类库支持许多诊断服务功能,这会使你的调试工作更加简单。这些诊断服务包括一些宏和全局函数,它们允许你跟踪程序的内存分配,在运行时转储对象的内容及在运行时打印调试信息。这些用于诊断服务的宏和全局函数可以组成以下几个类别:
·通用诊断宏。
·通用诊断函数和变量。
·对象诊断函数。

在MFC的调试和发行版本中,所有从CObject继承的类都可以使用这些宏和函数。但是,除了DEBUG_NEW和VERIFY以外,其他的在发行版本中都不起任何作用。
在调试版本的类库中,所有被分配的内存块都包含一部分“保护字节”。如果这些字节被非正常的内存读写所扰乱,诊断例程就会报告出问题。如果你在程序文件中包含了如下的程序行:
#define new DEBUG_NEW

所有对new的调用将保存了产生内存分配的文件名和行号。函数CMemoryState::Dump- AllObjectsSince 将会显示这些附加信息,使你能够识别内存泄漏。同时还可以参考CDumpContext类在诊断输出中给出的附加信息。
另外,C运行时库同样支持一个诊断函数集,你可以利用它来调试程序。如果需要获得更多的信息,请参阅《Microsoft Visual C++ 6.0库参考》中的《MicrosoftVisual C++ 6.0运行库参考》一卷中的“诊断例程”一文。

MFC通用调试宏
ASSERT在调试版本的库中,如果指定的表达式计算结果为FALSE,则打印出一条消息,然后退出程序
ASSERT_KINDOF测试一个对象是否属于一个指定的类或者从指定类继承而来的类
ASSERT_VALID调用对象的AssertValid成员函数测试对象的内部完整性;通常由CObject继承而来
DEBUG_NEW在调试模式下提供所有对象分配的文件名和行号以帮助发现内存泄漏
TRACE在类库的调试版本中提供了类似printf的功能
TRACE0与TRACE类似,但是接受的格式字符串不包括参数
TRACE1与TRACE类似,但是接受的格式字符串只包括一个参数
TRACE2与TRACE类似,但是接受的格式字符串只包括两个参数
TRACE3与TRACE类似,但是接受的格式字符串只包括三个参数
VERIFY与ASSERT类似,但是在Release版本中也象Debug版本一样计算表达式的值

MFC通用诊断变量和函数
afxDump全局变量,将CDumpContext信息发送的调试器输出窗口或者调试终端
afxMemDF全局变量,控制着调试内存分配器的特性
afxTraceEnabled全局变量,用于开放或者禁止TRACE宏的输出
afxTraceFlags全局变量,用于打开MFC内建的报告特性
AfxCheckError全局变量,用于测试传送的SCODE,检查是否是错误,如果是,抛出适当的错误
AfxCheckMemory检查当前分配的所有内存的完整性
AfxDump如果在调试器内调用,则在调试时转储对象的状态
AfxDumpStack生成当前栈的一个图象。这个函数通常被静态连接
AfxEnableMemoryTracking打开或关闭内存跟踪
AfxIsMemoryBlock检验一个内存块是否被正确地分配
AfxIsValidAddress检验一个内存地址是否属于程序的地址范围
AfxIsValidString检验一个指向字符串的指针是否有效
AfxSetAllocHook允许在每次进行内存分配时调用一个函数

MFC对象诊断函数
AfxDoForAllClasses对所有从CObject继承的支持运行时类型检查的类执行一个指定的功能
AfxDoForAllObjects对所有从CObject继承的用new分配内存的对象执行一个指定的功能