的标准问题包括:错误的输入数据、内存或者硬盘空间不够、不能打开一个文 件、外部设备不能访问、
网络连接不上或者甚至在程序中还有错误,目的是保持 程序的运行状态。 如果你的程序是防御性的, 别忘了使用断言。 如果你使用断言, 也别忘了防御性编程。这两种技术最好结合在一起使用。
二、跟踪语句
1、基本概念 跟踪语句(trace statements)可使程序执行,并使程序员可对可变值进 行查看。它们提供了一个用于观察的程序,并且独立于一个交互式的调试器,但 是最具有特色的是它们
常用于对调试器提供的信息进行补充。在 VC 中,跟踪消 息通常输出到输出窗口中的 Debug 标签,也可以重新输出到一个文件中。跟踪语 句的特性如下: .跟踪语句用于
报告代码中重要的运行事件。 .跟踪语句的编译通常是有条件的,并只存在于调试版本中,而在发布版 本中不被编译。 .跟踪语句不能包含程序代码或对程序代码有间接的影响作用。 .跟踪语句的目的是向程序员提供信息,而不是向用户。 跟踪语句也是调试语句,它可以执行程序,并且在运行中程序员可以查 看变量。跟踪语句对于那些使用交互式调试器很难调试的程序是很有效的。 跟踪语句和断言的区别如下: .跟踪语句是无条件的,断言是有条件的布尔语句。 .跟踪语句用于显示程序执行和变量值,不直接显示 bug,断言用于显示 出 bug。 .跟踪语句将信息输出到调试窗口或文件中,可被随意地忽略,断言打断 程序的执行。 2、MFC 中的跟踪语句 在 MFC 中,你可以使用 TRACE 和 AfxOutputDebugString 宏、 CObject::Dump 虚拟函数和 AfxDumpStack 函数。TRACE 宏由 AfxDump 实现, AfxDump 由 AfxOutputDebugString 实现。AfxOutputDebugString 宏和 AfxDumpStack 函数可以在所有版本中
编译,其他只能在调试版本中编译。
(1)TRACE 宏有以下形式:
_TRACE(reportType,format); _TRACE0(reportType,format,arg1);
_TRACE1(reportType,format,arg1,arg2); _TRACE2(reportType,format,arg1,arg2,arg3); _TRACE3(reportType,format,arg1,arg2,arg3,arg4); 在 MFC 中,推荐使用 TRACEn 宏,当使用 TRACE 宏时需要使用_T 宏来格 式化参数以正确解决 Unicode 的校正,而 TRACEn 不需要。 MFC TRACE 宏中的一个缺点是 AfxTrace 函数使用一个 512 字符固定大小 的缓冲区,这使得它在跟踪长字符串时是无用的。
(2)CObject::Dump
CObject 类有一个转储(dump)虚拟函数,所有继承 CObject 的类都可以 通过重载这个函数,输出它们的值。 C++消息 3、Visual C++消息 Pragma 消息 Pragma 实际上是一个编译时的跟踪语句, 你可以使用它来警告在预 处理过程中发现的潜在的编连(build)问题。典型的例子: #if (WINVER>=0x0500) #pragma message (“NOTE:WINVER has been defined as 0x0500 or greater.”) #endif 消息 Pragma 是非常有用的,尤其是在复杂编连中。然而,如果你要检测 一种特定的问题,而不是潜在的问题,